diff --git a/.gitignore b/.gitignore
deleted file mode 100644
index 639f873..0000000
--- a/.gitignore
+++ /dev/null
@@ -1,163 +0,0 @@
-*.pyc
-build/*
-dist/*
-*egg*/*
-*stop*
-files.txt
-pymic/test/runs/*
-
-# Created by https://www.toptal.com/developers/gitignore/api/python,jupyternotebooks
-# Edit at https://www.toptal.com/developers/gitignore?templates=python,jupyternotebooks
-
-### JupyterNotebooks ###
-# gitignore template for Jupyter Notebooks
-# website: http://jupyter.org/
-
-.ipynb_checkpoints
-*/.ipynb_checkpoints/*
-
-# IPython
-profile_default/
-ipython_config.py
-
-# Remove previous ipynb_checkpoints
-# git rm -r .ipynb_checkpoints/
-
-### Python ###
-# Byte-compiled / optimized / DLL files
-__pycache__/
-*.py[cod]
-*$py.class
-
-# C extensions
-*.so
-
-# Distribution / packaging
-.Python
-build/
-develop-eggs/
-dist/
-downloads/
-eggs/
-.eggs/
-lib/
-lib64/
-parts/
-sdist/
-var/
-wheels/
-share/python-wheels/
-*.egg-info/
-.installed.cfg
-*.egg
-MANIFEST
-
-# PyInstaller
-# Usually these files are written by a python script from a template
-# before PyInstaller builds the exe, so as to inject date/other infos into it.
-*.manifest
-*.spec
-
-# Installer logs
-pip-log.txt
-pip-delete-this-directory.txt
-
-# Unit test / coverage reports
-htmlcov/
-.tox/
-.nox/
-.coverage
-.coverage.*
-.cache
-nosetests.xml
-coverage.xml
-*.cover
-*.py,cover
-.hypothesis/
-.pytest_cache/
-cover/
-
-# Translations
-*.mo
-*.pot
-
-# Django stuff:
-*.log
-local_settings.py
-db.sqlite3
-db.sqlite3-journal
-
-# Flask stuff:
-instance/
-.webassets-cache
-
-# Scrapy stuff:
-.scrapy
-
-# Sphinx documentation
-docs/_build/
-
-# PyBuilder
-.pybuilder/
-target/
-
-# Jupyter Notebook
-
-# IPython
-
-# pyenv
-# For a library or package, you might want to ignore these files since the code is
-# intended to run in multiple environments; otherwise, check them in:
-# .python-version
-
-# pipenv
-# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
-# However, in case of collaboration, if having platform-specific dependencies or dependencies
-# having no cross-platform support, pipenv may install dependencies that don't work, or not
-# install all needed dependencies.
-#Pipfile.lock
-
-# PEP 582; used by e.g. github.com/David-OConnor/pyflow
-__pypackages__/
-
-# Celery stuff
-celerybeat-schedule
-celerybeat.pid
-
-# SageMath parsed files
-*.sage.py
-
-# Environments
-.env
-.venv
-env/
-venv/
-ENV/
-env.bak/
-venv.bak/
-
-# Spyder project settings
-.spyderproject
-.spyproject
-
-# Rope project settings
-.ropeproject
-
-# mkdocs documentation
-/site
-
-# mypy
-.mypy_cache/
-.dmypy.json
-dmypy.json
-
-# Pyre type checker
-.pyre/
-
-# pytype static type analyzer
-.pytype/
-
-# Cython debug symbols
-cython_debug/
-
-# End of https://www.toptal.com/developers/gitignore/api/python,jupyternotebooks
diff --git a/LICENSE b/LICENSE
deleted file mode 100644
index 85af0c9..0000000
--- a/LICENSE
+++ /dev/null
@@ -1,201 +0,0 @@
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
- To apply the Apache License to your work, attach the following
- boilerplate notice, with the fields enclosed by brackets "{}"
- replaced with your own identifying information. (Don't include
- the brackets!) The text should be enclosed in the appropriate
- comment syntax for the file format. We also recommend that a
- file or class name and description of purpose be included on the
- same "printed page" as the copyright notice for easier
- identification within third-party archives.
-
- Copyright 2019 University of Electronic Science and Technology of China
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
diff --git a/README.md b/README.md
deleted file mode 100644
index e7757c4..0000000
--- a/README.md
+++ /dev/null
@@ -1,97 +0,0 @@
-# PyMIC: A Pytorch-Based Toolkit for Medical Image Computing
-
-PyMIC is a pytorch-based toolkit for medical image computing with annotation-efficient deep learning. Despite that pytorch is a fantastic platform for deep learning, using it for medical image computing is not straightforward as medical images are often with high dimension and large volume, multiple modalities and difficulies in annotating. This toolkit is developed to facilitate medical image computing researchers so that training and testing deep learning models become easier. It is very friendly to researchers who are new to this area. Even without writing any code, you can use PyMIC commands to train and test a model by simply editing configuration files. PyMIC is developed to support learning with imperfect labels, including semi-supervised, self-supervised, and weakly supervised learning, and learning with noisy annotations.
-
-Currently PyMIC supports 2D/3D medical image classification and segmentation, and it is still under development. If you use this toolkit, please cite the following paper:
-
-* G. Wang, X. Luo, R. Gu, S. Yang, Y. Qu, S. Zhai, Q. Zhao, K. Li, S. Zhang. (2023).
-[PyMIC: A deep learning toolkit for annotation-efficient medical image segmentation.][arxiv2022] Computer Methods and Programs in Biomedicine (CMPB). February 2023, 107398.
-
-[arxiv2022]:http://arxiv.org/abs/2208.09350
-
-BibTeX entry:
-
- @article{Wang2022pymic,
- author = {Guotai Wang and Xiangde Luo and Ran Gu and Shuojue Yang and Yijie Qu and Shuwei Zhai and Qianfei Zhao and Kang Li and Shaoting Zhang},
- title = {{PyMIC: A deep learning toolkit for annotation-efficient medical image segmentation}},
- year = {2023},
- url = {https://doi.org/10.1016/j.cmpb.2023.107398},
- journal = {Computer Methods and Programs in Biomedicine},
- volume = {231},
- pages = {107398},
- }
-
-# News
-* 2025/08 PyMIC has contained the implementation of [`DMSPS`][dmsps_paper], a state-of-the-art weakly supervised segmentation method by learning from scribble annotations.
-* 2025/05 Several self-supervised learning methods have been provided in PyMIC, including [`VolF`][volf_paper], [`VoCo`][voco_paper] and [`Vox2Vec`][vox2vec_paper].
-* 2025/01 Novel architectures are available now, such as `UMamba`, `VMUNet`, `SwinUNet`, `TransUNet` and `UNETR++`.
-
-[dmsps_paper]: https://www.sciencedirect.com/science/article/pii/S1361841524001993
-[volf_paper]: https://arxiv.org/abs/2306.16925
-[voco_paper]: https://arxiv.org/abs/2402.17300
-[vox2vec_paper]:https://conferences.miccai.org/2023/papers/712-Paper3421.html
-
-# Features
-PyMIC provides flixible modules for medical image computing tasks including classification and segmentation. It currently provides the following functions:
-* Support for annotation-efficient image segmentation, especially for semi-supervised, self-supervised, self-supervised, weakly-supervised and noisy-label learning.
-* User friendly: For beginners, you only need to edit the configuration files for model training and inference, without writing code. For advanced users, you can customize different modules (networks, loss functions, training pipeline, etc) and easily integrate them into PyMIC.
-* Easy-to-use I/O interface to read and write different 2D and 3D images.
-* Various data pre-processing/transformation methods before sending a tensor into a network.
-* Implementation of typical neural networks for medical image segmentation.
-* Re-useable training and testing pipeline that can be transferred to different tasks.
-* Evaluation metrics for quantitative evaluation of your methods.
-
-# Usage
-## Requirement
-* [Pytorch][torch_link] version >=1.13.1
-* [TensorboardX][tbx_link] to visualize training performance
-* Some common python packages such as Numpy, Pandas, SimpleITK
-* causal-conv1d>=1.5.0 and mamba-ssm>=2.2.4 are required if you want to use Mamba in PyMIC.
-* See `requirements.txt` for details.
-
-[torch_link]:https://pytorch.org/
-[tbx_link]:https://github.com/lanpa/tensorboardX
-
-## Installation
-Run the following command to install the latest released version of PyMIC:
-
-```bash
-pip install PYMIC
-```
-To install a specific version of PYMIC such as 0.5.4, run:
-
-```bash
-pip install PYMIC==0.5.4
-```
-Alternatively, you can download the source code for the latest version. Run the following command to compile and install:
-
-```bash
-python setup.py install
-```
-
-## How to start
-* [PyMIC_examples][exp_link] shows some examples of starting to use PyMIC.
-* [PyMIC_doc][docs_link] provides documentation of this project.
-
-[docs_link]:https://pymic.readthedocs.io/en/latest/
-[exp_link]:https://github.com/HiLab-git/PyMIC_examples
-
-## Projects based on PyMIC
-Using PyMIC, it becomes easy to develop deep learning models for different projects, such as the following:
-
-1, [MyoPS][myops] Winner of the MICCAI 2020 myocardial pathology segmentation (MyoPS) Challenge.
-
-2, [COPLE-Net][coplenet] (TMI 2020), COVID-19 Pneumonia Segmentation from CT images.
-
-3, [Head-Neck-GTV][hn_gtv] (NeuroComputing 2020) Nasopharyngeal Carcinoma (NPC) GTV segmentation from Head and Neck CT images.
-
-4, [UGIR][ugir] (MICCAI 2020) Uncertainty-guided interactive refinement for medical image segmentation.
-
-5, [DMSPS][dmsps] (MedIA 2024) Weakly supervised segmentation by learning from scribbles.
-
-[myops]: https://github.com/HiLab-git/MyoPS2020
-[coplenet]:https://github.com/HiLab-git/COPLE-Net
-[hn_gtv]: https://github.com/HiLab-git/Head-Neck-GTV
-[ugir]: https://github.com/HiLab-git/UGIR
-[dmsps]: https://github.com/HiLab-git/DMSPS
-
diff --git a/_config.yml b/_config.yml
new file mode 100644
index 0000000..2f7efbe
--- /dev/null
+++ b/_config.yml
@@ -0,0 +1 @@
+theme: jekyll-theme-minimal
\ No newline at end of file
diff --git a/docs/.debug.yml b/docs/.debug.yml
deleted file mode 100644
index 05d534a..0000000
--- a/docs/.debug.yml
+++ /dev/null
@@ -1,3 +0,0 @@
-remote_theme: false
-
-theme: jekyll-rtd-theme
\ No newline at end of file
diff --git a/docs/Documentation/README.md b/docs/Documentation/README.md
deleted file mode 100644
index 7089b88..0000000
--- a/docs/Documentation/README.md
+++ /dev/null
@@ -1,4 +0,0 @@
----
-sort: 2
----
-# Readme for Documentation
\ No newline at end of file
diff --git a/docs/Gemfile b/docs/Gemfile
deleted file mode 100644
index 0519ecb..0000000
--- a/docs/Gemfile
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/docs/Makefile b/docs/Makefile
deleted file mode 100644
index d0c3cbf..0000000
--- a/docs/Makefile
+++ /dev/null
@@ -1,20 +0,0 @@
-# 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 = source
-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)
diff --git a/docs/README.md b/docs/README.md
deleted file mode 100644
index 174cc33..0000000
--- a/docs/README.md
+++ /dev/null
@@ -1,34 +0,0 @@
-## Welcome to PyMIC
-
-PyMIC is a pytorch-based toolkit for medical image computing with annotation-efficient deep learning. Despite that pytorch is a fantastic platform for deep learning, using it for medical image computing is not straightforward as medical images are often with high dimension and large volume, multiple modalities and difficulies in annotating. This toolkit is developed to facilitate medical image computing researchers so that training and testing deep learning models become easier. It is very friendly to researchers who are new to this area. Even without writing any code, you can use PyMIC commands to train and test a model by simply editing configuration files. PyMIC is developed to support learning with imperfect labels, including semi-supervised and weakly supervised learning, and learning with noisy annotations.
-
-Currently PyMIC supports 2D/3D medical image classification and segmentation, and it is still under development. It was originally developed for COVID-19 pneumonia lesion segmentation from CT images.
-
-### Features
-PyMIC provides flixible modules for medical image computing tasks including classification and segmentation. It currently provides the following functions:
-* Support for annotation-efficient image segmentation, especially for semi-supervised, weakly-supervised and noisy-label learning.
-* User friendly: For beginners, you only need to edit the configuration files for model training and inference, without writing code. For advanced users, you can customize different modules (networks, loss functions, training pipeline, etc) and easily integrate them into PyMIC.
-* Easy-to-use I/O interface to read and write different 2D and 3D images.
-* Various data pre-processing/transformation methods before sending a tensor into a network.
-* Implementation of typical neural networks for medical image segmentation.
-* Re-useable training and testing pipeline that can be transferred to different tasks.
-* Evaluation metrics for quantitative evaluation of your methods.
-
-### Installation
-Run the following command to install the current released version of PyMIC:
-
-```bash
-pip install PYMIC
-```
-
-Alternatively, you can download the source code for the latest version. Run the following command to compile and install:
-
-```bash
-python setup.py install
-```
-
-### Quick Start
-[PyMIC_examples][examples] provides some examples of starting to use PyMIC. At the beginning, you only need to edit the configuration files to select different datasets, networks and training methods for running the code. When you are more familiar with PyMIC, you can customize different modules in the PyMIC package. You can find both types of examples:
-
-[examples]: https://github.com/HiLab-git/PyMIC_examples
-
diff --git a/docs/_config.yml b/docs/_config.yml
deleted file mode 100644
index b849713..0000000
--- a/docs/_config.yml
+++ /dev/null
@@ -1 +0,0 @@
-theme: jekyll-theme-leap-day
\ No newline at end of file
diff --git a/docs/history.txt b/docs/history.txt
deleted file mode 100644
index 05dd41d..0000000
--- a/docs/history.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-2025.8.1 Add code of DMSPS
-2025.12.23 Add code of PS-Seg
-
-To do:
-(2025.8.25) data augmentation in Crop4vox2vec should be implemented in external transforms
-2026.4.28 In windows, the multiple process has some problem --> use a new pytorch version
-dependency should be added in requirement: imops, monai, ml_collections, einops, timm
\ No newline at end of file
diff --git a/docs/index.md b/docs/index.md
deleted file mode 100644
index ef7ab5b..0000000
--- a/docs/index.md
+++ /dev/null
@@ -1,34 +0,0 @@
-## Welcome to PyMIC
-
-PyMIC is a Pytorch-based toolkit for medical image computing with annotation-efficient deep learning. Despite that pytorch is a fantastic platform for deep learning, using it for medical image computing is not straightforward as medical images are often with high dimension and large volume, multiple modalities and difficulies in annotating. This toolkit is developed to facilitate medical image computing researchers so that training and testing deep learning models become easier. It is very friendly to researchers who are new to this area. Even without writing any code, you can use PyMIC commands to train and test a model by simply editing configuration files. PyMIC is developed to support learning with imperfect labels, including semi-supervised and weakly supervised learning, and learning with noisy annotations.
-
-Currently PyMIC supports 2D/3D medical image classification and segmentation, and it is still under development. It was originally developed for COVID-19 pneumonia lesion segmentation from CT images.
-
-### Features
-PyMIC provides flixible modules for medical image computing tasks including classification and segmentation. It currently provides the following functions:
-* Support for annotation-efficient image segmentation, especially for semi-supervised, weakly-supervised and noisy-label learning.
-* User friendly: For beginners, you only need to edit the configuration files for model training and inference, without writing code. For advanced users, you can customize different modules (networks, loss functions, training pipeline, etc) and easily integrate them into PyMIC.
-* Easy-to-use I/O interface to read and write different 2D and 3D images.
-* Various data pre-processing/transformation methods before sending a tensor into a network.
-* Implementation of typical neural networks for medical image segmentation.
-* Re-useable training and testing pipeline that can be transferred to different tasks.
-* Evaluation metrics for quantitative evaluation of your methods.
-
-### Installation
-Run the following command to install the current released version of PyMIC:
-
-```bash
-pip install PYMIC
-```
-
-Alternatively, you can download the source code for the latest version. Run the following command to compile and install:
-
-```bash
-python setup.py install
-```
-
-### Quick Start
-[PyMIC_examples][examples] provides some examples of starting to use PyMIC. At the beginning, you only need to edit the configuration files to select different datasets, networks and training methods for running the code. When you are more familiar with PyMIC, you can customize different modules in the PyMIC package. You can find both types of examples:
-
-[examples]: https://github.com/HiLab-git/PyMIC_examples
-
diff --git a/docs/make.bat b/docs/make.bat
deleted file mode 100644
index 9534b01..0000000
--- a/docs/make.bat
+++ /dev/null
@@ -1,35 +0,0 @@
-@ECHO OFF
-
-pushd %~dp0
-
-REM Command file for Sphinx documentation
-
-if "%SPHINXBUILD%" == "" (
- set SPHINXBUILD=sphinx-build
-)
-set SOURCEDIR=source
-set BUILDDIR=build
-
-if "%1" == "" goto help
-
-%SPHINXBUILD% >NUL 2>NUL
-if errorlevel 9009 (
- echo.
- echo.The 'sphinx-build' command was not found. Make sure you have Sphinx
- echo.installed, then set the SPHINXBUILD environment variable to point
- echo.to the full path of the 'sphinx-build' executable. Alternatively you
- echo.may add the Sphinx directory to PATH.
- echo.
- echo.If you don't have Sphinx installed, grab it from
- echo.http://sphinx-doc.org/
- exit /b 1
-)
-
-%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
-goto end
-
-:help
-%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
-
-:end
-popd
diff --git a/docs/source/api.rst b/docs/source/api.rst
deleted file mode 100644
index d09809c..0000000
--- a/docs/source/api.rst
+++ /dev/null
@@ -1,13 +0,0 @@
-API
-===
-
-.. toctree::
- :maxdepth: 4
-
- pymic.io
- pymic.layer
- pymic.loss
- pymic.net
- pymic.net_run
- pymic.transform
- pymic.util
\ No newline at end of file
diff --git a/docs/source/conf.py b/docs/source/conf.py
deleted file mode 100644
index 09f2b50..0000000
--- a/docs/source/conf.py
+++ /dev/null
@@ -1,38 +0,0 @@
-# Configuration file for the Sphinx documentation builder.
-
-# -- Project information
-import os
-import sys
-sys.path.insert(0, os.path.abspath('./../..'))
-
-project = 'PyMIC'
-copyright = '2021, HiLab'
-author = 'HiLab'
-
-release = '0.4'
-version = '0.4.0'
-
-# -- General configuration
-
-extensions = [
- 'sphinx.ext.duration',
- 'sphinx.ext.doctest',
- 'sphinx.ext.autodoc',
- 'sphinx.ext.autosummary',
- 'sphinx.ext.intersphinx',
-]
-
-intersphinx_mapping = {
- 'python': ('https://docs.python.org/3/', None),
- 'sphinx': ('https://www.sphinx-doc.org/en/master/', None),
-}
-intersphinx_disabled_domains = ['std']
-
-templates_path = ['_templates']
-
-# -- Options for HTML output
-
-html_theme = 'sphinx_rtd_theme'
-
-# -- Options for EPUB output
-epub_show_urls = 'footnote'
diff --git a/docs/source/index.rst b/docs/source/index.rst
deleted file mode 100644
index c1b6523..0000000
--- a/docs/source/index.rst
+++ /dev/null
@@ -1,48 +0,0 @@
-Welcome to PyMIC's documentation!
-===================================
-
-PyMIC is a pytorch-based toolkit for medical image computing with annotation-efficient
-deep learning. PyMIC is developed to support learning with imperfect labels, including
-semi-supervised and weakly supervised learning, and learning with noisy annotations.
-
-Check out the :doc:`installation` section for install PyMIC, and go to the :doc:`usage`
-section for understanding modules for the segmentation pipeline designed in PyMIC.
-Please follow `PyMIC_examples `_
-to quickly start with using PyMIC.
-
-.. note::
-
- This project is under active development. It will be updated later.
-
-
-.. toctree::
- :maxdepth: 2
- :caption: Getting Started
-
- installation
- usage
- api
-
-Citation
---------
-
-If you use PyMIC for your research, please acknowledge it accordingly by citing our paper:
-
-`G. Wang, X. Luo, R. Gu, S. Yang, Y. Qu, S. Zhai, Q. Zhao, K. Li, S. Zhang.
-PyMIC: A deep learning toolkit for annotation-efficient medical image segmentation.
-Computer Methods and Programs in Biomedicine (CMPB). 231 (2023): 107398. `_
-
-
-BibTeX entry:
-
-.. code-block:: none
-
- @article{Wang2022pymic,
- author = {Guotai Wang and Xiangde Luo and Ran Gu and Shuojue Yang and Yijie Qu and Shuwei Zhai and Qianfei Zhao and Kang Li and Shaoting Zhang},
- title = {{PyMIC: A deep learning toolkit for annotation-efficient medical image segmentation}},
- year = {2022},
- url = {https://doi.org/10.1016/j.cmpb.2023.107398},
- journal = {Computer Methods and Programs in Biomedicine},
- volume = {231},
- pages = {107398},
- }
diff --git a/docs/source/installation.rst b/docs/source/installation.rst
deleted file mode 100644
index c1055e1..0000000
--- a/docs/source/installation.rst
+++ /dev/null
@@ -1,28 +0,0 @@
-Installation
-============
-
-Install PyMIC using pip (e.g., within a `Python virtual environment `_):
-
-.. code-block:: bash
-
- pip install PYMIC
-
-
-Alternatively, you can download or clone the code from `GitHub `_ and install PyMIC by
-
-.. code-block:: bash
-
- git clone https://github.com/HiLab-git/PyMIC
- cd PyMIC
- python setup.py install
-
-
-PyMIC requires Python 3.6 (or higher) and depends on the following packages.
-They will be automatically installed when using `pip install`.
-
- - `pandas `_
- - `h5py `_
- - `NumPy `_
- - `scikit-image `_
- - `SciPy `_
- - `SimpleITK `_
diff --git a/docs/source/modules.rst b/docs/source/modules.rst
deleted file mode 100644
index 07e93c1..0000000
--- a/docs/source/modules.rst
+++ /dev/null
@@ -1,7 +0,0 @@
-pymic
-=====
-
-.. toctree::
- :maxdepth: 4
-
- pymic
diff --git a/docs/source/pymic.io.rst b/docs/source/pymic.io.rst
deleted file mode 100644
index 812522f..0000000
--- a/docs/source/pymic.io.rst
+++ /dev/null
@@ -1,37 +0,0 @@
-pymic.io package
-================
-
-Submodules
-----------
-
-pymic.io.h5\_dataset module
----------------------------
-
-.. automodule:: pymic.io.h5_dataset
- :members:
- :undoc-members:
- :show-inheritance:
-
-pymic.io.image\_read\_write module
-----------------------------------
-
-.. automodule:: pymic.io.image_read_write
- :members:
- :undoc-members:
- :show-inheritance:
-
-pymic.io.nifty\_dataset module
-------------------------------
-
-.. automodule:: pymic.io.nifty_dataset
- :members:
- :undoc-members:
- :show-inheritance:
-
-Module contents
----------------
-
-.. automodule:: pymic.io
- :members:
- :undoc-members:
- :show-inheritance:
diff --git a/docs/source/pymic.layer.rst b/docs/source/pymic.layer.rst
deleted file mode 100644
index 211beb7..0000000
--- a/docs/source/pymic.layer.rst
+++ /dev/null
@@ -1,45 +0,0 @@
-pymic.layer package
-===================
-
-Submodules
-----------
-
-pymic.layer.activation module
------------------------------
-
-.. automodule:: pymic.layer.activation
- :members:
- :undoc-members:
- :show-inheritance:
-
-pymic.layer.convolution module
-------------------------------
-
-.. automodule:: pymic.layer.convolution
- :members:
- :undoc-members:
- :show-inheritance:
-
-pymic.layer.deconvolution module
---------------------------------
-
-.. automodule:: pymic.layer.deconvolution
- :members:
- :undoc-members:
- :show-inheritance:
-
-pymic.layer.space2channel module
---------------------------------
-
-.. automodule:: pymic.layer.space2channel
- :members:
- :undoc-members:
- :show-inheritance:
-
-Module contents
----------------
-
-.. automodule:: pymic.layer
- :members:
- :undoc-members:
- :show-inheritance:
diff --git a/docs/source/pymic.loss.cls.rst b/docs/source/pymic.loss.cls.rst
deleted file mode 100644
index 6f4cfca..0000000
--- a/docs/source/pymic.loss.cls.rst
+++ /dev/null
@@ -1,29 +0,0 @@
-pymic.loss.cls package
-======================
-
-Submodules
-----------
-
-pymic.loss.cls.basic module
-------------------------
-
-.. automodule:: pymic.loss.cls.basic
- :members:
- :undoc-members:
- :show-inheritance:
-
-pymic.loss.cls.util module
---------------------------
-
-.. automodule:: pymic.loss.cls.util
- :members:
- :undoc-members:
- :show-inheritance:
-
-Module contents
----------------
-
-.. automodule:: pymic.loss.cls
- :members:
- :undoc-members:
- :show-inheritance:
diff --git a/docs/source/pymic.loss.rst b/docs/source/pymic.loss.rst
deleted file mode 100644
index 437e7c0..0000000
--- a/docs/source/pymic.loss.rst
+++ /dev/null
@@ -1,38 +0,0 @@
-pymic.loss package
-==================
-
-Subpackages
------------
-
-.. toctree::
- :maxdepth: 4
-
- pymic.loss.cls
- pymic.loss.seg
-
-Submodules
-----------
-
-pymic.loss.loss\_dict\_cls module
----------------------------------
-
-.. automodule:: pymic.loss.loss_dict_cls
- :members:
- :undoc-members:
- :show-inheritance:
-
-pymic.loss.loss\_dict\_seg module
----------------------------------
-
-.. automodule:: pymic.loss.loss_dict_seg
- :members:
- :undoc-members:
- :show-inheritance:
-
-Module contents
----------------
-
-.. automodule:: pymic.loss
- :members:
- :undoc-members:
- :show-inheritance:
diff --git a/docs/source/pymic.loss.seg.rst b/docs/source/pymic.loss.seg.rst
deleted file mode 100644
index d858bda..0000000
--- a/docs/source/pymic.loss.seg.rst
+++ /dev/null
@@ -1,109 +0,0 @@
-pymic.loss.seg package
-======================
-
-Submodules
-----------
-
-pymic.loss.seg.abstract module
-------------------------
-
-.. automodule:: pymic.loss.seg.abstract
- :members:
- :undoc-members:
- :show-inheritance:
-
-pymic.loss.seg.ce module
-------------------------
-
-.. automodule:: pymic.loss.seg.ce
- :members:
- :undoc-members:
- :show-inheritance:
-
-pymic.loss.seg.combined module
-------------------------------
-
-.. automodule:: pymic.loss.seg.combined
- :members:
- :undoc-members:
- :show-inheritance:
-
-pymic.loss.seg.deep\_sup module
--------------------------------
-
-.. automodule:: pymic.loss.seg.deep_sup
- :members:
- :undoc-members:
- :show-inheritance:
-
-pymic.loss.seg.dice module
---------------------------
-
-.. automodule:: pymic.loss.seg.dice
- :members:
- :undoc-members:
- :show-inheritance:
-
-pymic.loss.seg.exp\_log module
-------------------------------
-
-.. automodule:: pymic.loss.seg.exp_log
- :members:
- :undoc-members:
- :show-inheritance:
-
-pymic.loss.seg.gatedcrf module
-------------------------------
-
-.. automodule:: pymic.loss.seg.gatedcrf
- :members:
- :undoc-members:
- :show-inheritance:
-
-pymic.loss.seg.mse module
--------------------------
-
-.. automodule:: pymic.loss.seg.mse
- :members:
- :undoc-members:
- :show-inheritance:
-
-pymic.loss.seg.mumford\_shah module
------------------------------------
-
-.. automodule:: pymic.loss.seg.mumford_shah
- :members:
- :undoc-members:
- :show-inheritance:
-
-pymic.loss.seg.slsr module
---------------------------
-
-.. automodule:: pymic.loss.seg.slsr
- :members:
- :undoc-members:
- :show-inheritance:
-
-pymic.loss.seg.ssl module
--------------------------
-
-.. automodule:: pymic.loss.seg.ssl
- :members:
- :undoc-members:
- :show-inheritance:
-
-pymic.loss.seg.util module
---------------------------
-
-.. automodule:: pymic.loss.seg.util
- :members:
- :undoc-members:
- :show-inheritance:
-
-Module contents
----------------
-
-.. automodule:: pymic.loss.seg
- :members:
- :undoc-members:
- :show-inheritance:
diff --git a/docs/source/pymic.net.cls.rst b/docs/source/pymic.net.cls.rst
deleted file mode 100644
index 42842f7..0000000
--- a/docs/source/pymic.net.cls.rst
+++ /dev/null
@@ -1,21 +0,0 @@
-pymic.net.cls package
-=====================
-
-Submodules
-----------
-
-pymic.net.cls.torch\_pretrained\_net module
--------------------------------------------
-
-.. automodule:: pymic.net.cls.torch_pretrained_net
- :members:
- :undoc-members:
- :show-inheritance:
-
-Module contents
----------------
-
-.. automodule:: pymic.net.cls
- :members:
- :undoc-members:
- :show-inheritance:
diff --git a/docs/source/pymic.net.net2d.rst b/docs/source/pymic.net.net2d.rst
deleted file mode 100644
index bd54bc6..0000000
--- a/docs/source/pymic.net.net2d.rst
+++ /dev/null
@@ -1,93 +0,0 @@
-pymic.net.net2d package
-=======================
-
-Submodules
-----------
-
-pymic.net.net2d.cople\_net module
----------------------------------
-
-.. automodule:: pymic.net.net2d.cople_net
- :members:
- :undoc-members:
- :show-inheritance:
-
-pymic.net.net2d.scse2d module
------------------------------
-
-.. automodule:: pymic.net.net2d.scse2d
- :members:
- :undoc-members:
- :show-inheritance:
-
-pymic.net.net2d.unet2d module
------------------------------
-
-.. automodule:: pymic.net.net2d.unet2d
- :members:
- :undoc-members:
- :show-inheritance:
-
-pymic.net.net2d.unet2d\_attention module
-----------------------------------------
-
-.. automodule:: pymic.net.net2d.unet2d_attention
- :members:
- :undoc-members:
- :show-inheritance:
-
-pymic.net.net2d.unet2d\_cct module
-----------------------------------
-
-.. automodule:: pymic.net.net2d.unet2d_cct
- :members:
- :undoc-members:
- :show-inheritance:
-
-pymic.net.net2d.unet2d\_dual\_branch module
--------------------------------------------
-
-.. automodule:: pymic.net.net2d.unet2d_dual_branch
- :members:
- :undoc-members:
- :show-inheritance:
-
-pymic.net.net2d.unet2d\_mcnet module
--------------------------------------------
-
-.. automodule:: pymic.net.net2d.unet2d_mcnet
- :members:
- :undoc-members:
- :show-inheritance:
-
-pymic.net.net2d.unet2d\_nest module
------------------------------------
-
-.. automodule:: pymic.net.net2d.unet2d_nest
- :members:
- :undoc-members:
- :show-inheritance:
-
-pymic.net.net2d.unet2d\_scse module
------------------------------------
-
-.. automodule:: pymic.net.net2d.unet2d_scse
- :members:
- :undoc-members:
- :show-inheritance:
-
-pymic.net.net2d.unet2d\_urpc module
------------------------------------
-
-.. automodule:: pymic.net.net2d.unet2d_urpc
- :members:
- :undoc-members:
- :show-inheritance:
-
-Module contents
----------------
-
-.. automodule:: pymic.net.net2d
- :members:
- :undoc-members:
- :show-inheritance:
diff --git a/docs/source/pymic.net.net3d.rst b/docs/source/pymic.net.net3d.rst
deleted file mode 100644
index a09c187..0000000
--- a/docs/source/pymic.net.net3d.rst
+++ /dev/null
@@ -1,45 +0,0 @@
-pymic.net.net3d package
-=======================
-
-Submodules
-----------
-
-pymic.net.net3d.scse3d module
------------------------------
-
-.. automodule:: pymic.net.net3d.scse3d
- :members:
- :undoc-members:
- :show-inheritance:
-
-pymic.net.net3d.unet2d5 module
-------------------------------
-
-.. automodule:: pymic.net.net3d.unet2d5
- :members:
- :undoc-members:
- :show-inheritance:
-
-pymic.net.net3d.unet3d module
------------------------------
-
-.. automodule:: pymic.net.net3d.unet3d
- :members:
- :undoc-members:
- :show-inheritance:
-
-pymic.net.net3d.unet3d\_scse module
------------------------------------
-
-.. automodule:: pymic.net.net3d.unet3d_scse
- :members:
- :undoc-members:
- :show-inheritance:
-
-Module contents
----------------
-
-.. automodule:: pymic.net.net3d
- :members:
- :undoc-members:
- :show-inheritance:
diff --git a/docs/source/pymic.net.rst b/docs/source/pymic.net.rst
deleted file mode 100644
index 01a3209..0000000
--- a/docs/source/pymic.net.rst
+++ /dev/null
@@ -1,39 +0,0 @@
-pymic.net package
-=================
-
-Subpackages
------------
-
-.. toctree::
- :maxdepth: 4
-
- pymic.net.cls
- pymic.net.net2d
- pymic.net.net3d
-
-Submodules
-----------
-
-pymic.net.net\_dict\_cls module
--------------------------------
-
-.. automodule:: pymic.net.net_dict_cls
- :members:
- :undoc-members:
- :show-inheritance:
-
-pymic.net.net\_dict\_seg module
--------------------------------
-
-.. automodule:: pymic.net.net_dict_seg
- :members:
- :undoc-members:
- :show-inheritance:
-
-Module contents
----------------
-
-.. automodule:: pymic.net
- :members:
- :undoc-members:
- :show-inheritance:
diff --git a/docs/source/pymic.net_run.noisy_label.rst b/docs/source/pymic.net_run.noisy_label.rst
deleted file mode 100644
index 04d38bb..0000000
--- a/docs/source/pymic.net_run.noisy_label.rst
+++ /dev/null
@@ -1,45 +0,0 @@
-pymic.net\_run.noisy\_label package
-===================================
-
-Submodules
-----------
-
-pymic.net\_run.noisy\_label.nll\_clslsr module
-----------------------------------------------
-
-.. automodule:: pymic.net_run.noisy_label.nll_clslsr
- :members:
- :undoc-members:
- :show-inheritance:
-
-pymic.net\_run.noisy\_label.nll\_co\_teaching module
-----------------------------------------------------
-
-.. automodule:: pymic.net_run.noisy_label.nll_co_teaching
- :members:
- :undoc-members:
- :show-inheritance:
-
-pymic.net\_run.noisy\_label.nll\_dast module
---------------------------------------------
-
-.. automodule:: pymic.net_run.noisy_label.nll_dast
- :members:
- :undoc-members:
- :show-inheritance:
-
-pymic.net\_run.noisy\_label.nll\_trinet module
-----------------------------------------------
-
-.. automodule:: pymic.net_run.noisy_label.nll_trinet
- :members:
- :undoc-members:
- :show-inheritance:
-
-Module contents
----------------
-
-.. automodule:: pymic.net_run.noisy_label
- :members:
- :undoc-members:
- :show-inheritance:
diff --git a/docs/source/pymic.net_run.rst b/docs/source/pymic.net_run.rst
deleted file mode 100644
index 9f3bc26..0000000
--- a/docs/source/pymic.net_run.rst
+++ /dev/null
@@ -1,63 +0,0 @@
-pymic.net\_run package
-======================
-
-Subpackages
------------
-
-.. toctree::
- :maxdepth: 4
-
- pymic.net_run.semi_sup
- pymic.net_run.weak_sup
- pymic.net_run.noisy_label
-
-Submodules
-----------
-
-pymic.net\_run.agent\_abstract module
--------------------------------------
-
-.. automodule:: pymic.net_run.agent_abstract
- :members:
- :undoc-members:
- :show-inheritance:
-
-pymic.net\_run.agent\_cls module
---------------------------------
-
-.. automodule:: pymic.net_run.agent_cls
- :members:
- :undoc-members:
- :show-inheritance:
-
-pymic.net\_run.agent\_seg module
---------------------------------
-
-.. automodule:: pymic.net_run.agent_seg
- :members:
- :undoc-members:
- :show-inheritance:
-
-pymic.net\_run.get\_optimizer module
-------------------------------------
-
-.. automodule:: pymic.net_run.get_optimizer
- :members:
- :undoc-members:
- :show-inheritance:
-
-pymic.net\_run.infer\_func module
----------------------------------
-
-.. automodule:: pymic.net_run.infer_func
- :members:
- :undoc-members:
- :show-inheritance:
-
-Module contents
----------------
-
-.. automodule:: pymic.net_run
- :members:
- :undoc-members:
- :show-inheritance:
diff --git a/docs/source/pymic.net_run.self_sup.rst b/docs/source/pymic.net_run.self_sup.rst
deleted file mode 100644
index a4568d1..0000000
--- a/docs/source/pymic.net_run.self_sup.rst
+++ /dev/null
@@ -1,21 +0,0 @@
-pymic.net\_run.self\_sup package
-================================
-
-Submodules
-----------
-
-pymic.net\_run.self\_sup.self\_sl\_agent module
------------------------------------------------
-
-.. automodule:: pymic.net_run.self_sup.self_sl_agent
- :members:
- :undoc-members:
- :show-inheritance:
-
-Module contents
----------------
-
-.. automodule:: pymic.net_run.self_sup
- :members:
- :undoc-members:
- :show-inheritance:
diff --git a/docs/source/pymic.net_run.semi_sup.rst b/docs/source/pymic.net_run.semi_sup.rst
deleted file mode 100644
index 15692b2..0000000
--- a/docs/source/pymic.net_run.semi_sup.rst
+++ /dev/null
@@ -1,77 +0,0 @@
-pymic.net\_run.semi\_sup package
-================================
-
-Submodules
-----------
-
-pymic.net\_run.semi\_sup.ssl\_abstract module
----------------------------------------------
-
-.. automodule:: pymic.net_run.semi_sup.ssl_abstract
- :members:
- :undoc-members:
- :show-inheritance:
-
-pymic.net\_run.semi\_sup.ssl\_cct module
-----------------------------------------
-
-.. automodule:: pymic.net_run.semi_sup.ssl_cct
- :members:
- :undoc-members:
- :show-inheritance:
-
-pymic.net\_run.semi\_sup.ssl\_cps module
-----------------------------------------
-
-.. automodule:: pymic.net_run.semi_sup.ssl_cps
- :members:
- :undoc-members:
- :show-inheritance:
-
-pymic.net\_run.semi\_sup.ssl\_mcnet module
-----------------------------------------
-
-.. automodule:: pymic.net_run.semi_sup.ssl_mcnet
- :members:
- :undoc-members:
- :show-inheritance:
-
-pymic.net\_run.semi\_sup.ssl\_em module
----------------------------------------
-
-.. automodule:: pymic.net_run.semi_sup.ssl_em
- :members:
- :undoc-members:
- :show-inheritance:
-
-pymic.net\_run.semi\_sup.ssl\_mt module
----------------------------------------
-
-.. automodule:: pymic.net_run.semi_sup.ssl_mt
- :members:
- :undoc-members:
- :show-inheritance:
-
-pymic.net\_run.semi\_sup.ssl\_uamt module
------------------------------------------
-
-.. automodule:: pymic.net_run.semi_sup.ssl_uamt
- :members:
- :undoc-members:
- :show-inheritance:
-
-pymic.net\_run.semi\_sup.ssl\_urpc module
------------------------------------------
-
-.. automodule:: pymic.net_run.semi_sup.ssl_urpc
- :members:
- :undoc-members:
- :show-inheritance:
-
-Module contents
----------------
-
-.. automodule:: pymic.net_run.semi_sup
- :members:
- :undoc-members:
- :show-inheritance:
diff --git a/docs/source/pymic.net_run.weak_sup.rst b/docs/source/pymic.net_run.weak_sup.rst
deleted file mode 100644
index b906f72..0000000
--- a/docs/source/pymic.net_run.weak_sup.rst
+++ /dev/null
@@ -1,69 +0,0 @@
-pymic.net\_run.weak\_sup package
-================================
-
-Submodules
-----------
-
-pymic.net\_run.weak\_sup.wsl\_abstract module
----------------------------------------------
-
-.. automodule:: pymic.net_run.weak_sup.wsl_abstract
- :members:
- :undoc-members:
- :show-inheritance:
-
-pymic.net\_run.weak\_sup.wsl\_dmpls module
-------------------------------------------
-
-.. automodule:: pymic.net_run.weak_sup.wsl_dmpls
- :members:
- :undoc-members:
- :show-inheritance:
-
-pymic.net\_run.weak\_sup.wsl\_em module
----------------------------------------
-
-.. automodule:: pymic.net_run.weak_sup.wsl_em
- :members:
- :undoc-members:
- :show-inheritance:
-
-pymic.net\_run.weak\_sup.wsl\_gatedcrf module
----------------------------------------------
-
-.. automodule:: pymic.net_run.weak_sup.wsl_gatedcrf
- :members:
- :undoc-members:
- :show-inheritance:
-
-pymic.net\_run.weak\_sup.wsl\_mumford\_shah module
---------------------------------------------------
-
-.. automodule:: pymic.net_run.weak_sup.wsl_mumford_shah
- :members:
- :undoc-members:
- :show-inheritance:
-
-pymic.net\_run.weak\_sup.wsl\_tv module
----------------------------------------
-
-.. automodule:: pymic.net_run.weak_sup.wsl_tv
- :members:
- :undoc-members:
- :show-inheritance:
-
-pymic.net\_run.weak\_sup.wsl\_ustm module
------------------------------------------
-
-.. automodule:: pymic.net_run.weak_sup.wsl_ustm
- :members:
- :undoc-members:
- :show-inheritance:
-
-Module contents
----------------
-
-.. automodule:: pymic.net_run.weak_sup
- :members:
- :undoc-members:
- :show-inheritance:
diff --git a/docs/source/pymic.rst b/docs/source/pymic.rst
deleted file mode 100644
index dd180f0..0000000
--- a/docs/source/pymic.rst
+++ /dev/null
@@ -1,24 +0,0 @@
-pymic package
-=============
-
-Subpackages
------------
-
-.. toctree::
- :maxdepth: 4
-
- pymic.io
- pymic.layer
- pymic.loss
- pymic.net
- pymic.net_run
- pymic.transform
- pymic.util
-
-Module contents
----------------
-
-.. automodule:: pymic
- :members:
- :undoc-members:
- :show-inheritance:
diff --git a/docs/source/pymic.transform.rst b/docs/source/pymic.transform.rst
deleted file mode 100644
index 6b78bf1..0000000
--- a/docs/source/pymic.transform.rst
+++ /dev/null
@@ -1,101 +0,0 @@
-pymic.transform package
-=======================
-
-Submodules
-----------
-
-pymic.transform.abstract\_transform module
-------------------------------------------
-
-.. automodule:: pymic.transform.abstract_transform
- :members:
- :undoc-members:
- :show-inheritance:
-
-pymic.transform.crop module
----------------------------
-
-.. automodule:: pymic.transform.crop
- :members:
- :undoc-members:
- :show-inheritance:
-
-pymic.transform.flip module
----------------------------
-
-.. automodule:: pymic.transform.flip
- :members:
- :undoc-members:
- :show-inheritance:
-
-pymic.transform.intensity module
---------------------------------
-
-.. automodule:: pymic.transform.intensity
- :members:
- :undoc-members:
- :show-inheritance:
-
-pymic.transform.label\_convert module
--------------------------------------
-
-.. automodule:: pymic.transform.label_convert
- :members:
- :undoc-members:
- :show-inheritance:
-
-pymic.transform.normalize module
---------------------------------
-
-.. automodule:: pymic.transform.normalize
- :members:
- :undoc-members:
- :show-inheritance:
-
-pymic.transform.pad module
---------------------------
-
-.. automodule:: pymic.transform.pad
- :members:
- :undoc-members:
- :show-inheritance:
-
-pymic.transform.rescale module
-------------------------------
-
-.. automodule:: pymic.transform.rescale
- :members:
- :undoc-members:
- :show-inheritance:
-
-pymic.transform.rotate module
------------------------------
-
-.. automodule:: pymic.transform.rotate
- :members:
- :undoc-members:
- :show-inheritance:
-
-pymic.transform.threshold module
---------------------------------
-
-.. automodule:: pymic.transform.threshold
- :members:
- :undoc-members:
- :show-inheritance:
-
-pymic.transform.trans\_dict module
-----------------------------------
-
-.. automodule:: pymic.transform.trans_dict
- :members:
- :undoc-members:
- :show-inheritance:
-
-Module contents
----------------
-
-.. automodule:: pymic.transform
- :members:
- :undoc-members:
- :show-inheritance:
diff --git a/docs/source/pymic.util.rst b/docs/source/pymic.util.rst
deleted file mode 100644
index 65ef60d..0000000
--- a/docs/source/pymic.util.rst
+++ /dev/null
@@ -1,77 +0,0 @@
-pymic.util package
-==================
-
-Submodules
-----------
-
-pymic.util.evaluation\_cls module
----------------------------------
-
-.. automodule:: pymic.util.evaluation_cls
- :members:
- :undoc-members:
- :show-inheritance:
-
-pymic.util.evaluation\_seg module
----------------------------------
-
-.. automodule:: pymic.util.evaluation_seg
- :members:
- :undoc-members:
- :show-inheritance:
-
-pymic.util.general module
--------------------------
-
-.. automodule:: pymic.util.general
- :members:
- :undoc-members:
- :show-inheritance:
-
-pymic.util.image\_process module
---------------------------------
-
-.. automodule:: pymic.util.image_process
- :members:
- :undoc-members:
- :show-inheritance:
-
-pymic.util.parse\_config module
--------------------------------
-
-.. automodule:: pymic.util.parse_config
- :members:
- :undoc-members:
- :show-inheritance:
-
-pymic.util.post\_process module
--------------------------------
-
-.. automodule:: pymic.util.post_process
- :members:
- :undoc-members:
- :show-inheritance:
-
-pymic.util.preprocess module
-----------------------------
-
-.. automodule:: pymic.util.preprocess
- :members:
- :undoc-members:
- :show-inheritance:
-
-pymic.util.ramps module
------------------------
-
-.. automodule:: pymic.util.ramps
- :members:
- :undoc-members:
- :show-inheritance:
-
-Module contents
----------------
-
-.. automodule:: pymic.util
- :members:
- :undoc-members:
- :show-inheritance:
diff --git a/docs/source/setup.rst b/docs/source/setup.rst
deleted file mode 100644
index 552eb49..0000000
--- a/docs/source/setup.rst
+++ /dev/null
@@ -1,7 +0,0 @@
-setup module
-============
-
-.. automodule:: setup
- :members:
- :undoc-members:
- :show-inheritance:
diff --git a/docs/source/usage.fsl.rst b/docs/source/usage.fsl.rst
deleted file mode 100644
index 937bb01..0000000
--- a/docs/source/usage.fsl.rst
+++ /dev/null
@@ -1,400 +0,0 @@
-.. _fully_supervised_learning:
-
-Fully Supervised Learning
-=========================
-
-SegmentationAgent
------------------
-
-:mod:`pymic.net_run.agent_seg.SegmentationAgent` is the general class used for training
-and inference of deep learning models. You just need to specify a configuration file to
-initialize an instance of that class. An example code to use it is:
-
-.. code-block:: none
-
- from pymic.util.parse_config import *
- from pymic.net_run.agent_seg import SegmentationAgent
-
- config_name = "a_config_file.cfg"
- config = parse_config(config_name)
- config = synchronize_config(config)
- stage = "train" # or "test"
- agent = SegmentationAgent(config, stage)
- agent.run()
-
-The above code will use the dataset, network and loss function, etc specifcied in the
-configuration file for running.
-
-.. tip::
-
- If you use the built-in modules such as ``UNet`` and ``Dice`` + ``CrossEntropy`` loss
- for segmentation, you don't need to write the above code. Just just use the ``pymic_train``
- command. See examples in `PyMIC_examples/segmentation/ `_.
-
-Dataset
--------
-
-PyMIC provides two types of datasets for loading images from
-disk to memory: ``NiftyDataset`` and ``H5DataSet``.
-``NiftyDataset`` is designed for 2D and 3D images in common formats
-such as png, jpeg, bmp and nii.gz. ``H5DataSet`` is used for
-hdf5 data that are more efficient to load.
-
-To use ``NiftyDataset``, users need to specify the root path
-of the dataset and the csv file storing the image and label
-file names. The configurations include the following items:
-
-* ``tensor_type``: data type for tensors. Should be :mod:`float` or :mod:`double`.
-
-* ``task_type``: should be :mod:`seg` for segmentation tasks.
-
-* ``root_dir`` (string): the root dir of dataset.
-
-* ``modal_num`` (int, default is 1): modalities number. For images with N modalities,
- each modality should be saved in an indepdent file.
-
-* ``train_csv`` (string): the path of csv file for training set.
-
-* ``valid_csv`` (string): the path of csv file for validation set.
-
-* ``test_csv`` (string): the path of csv file for testing set.
-
-* ``train_batch_size`` (int): the batch size for training set.
-
-* ``valid_batch_size`` (int, optional): the batch size for validation set.
- The defualt value is set as :mod:`train_batch_size`.
-
-* ``test_batch_size`` (int, optional): the batch size for testing set.
- The defualt value is 1.
-
-The csv file should have at least two columns (fields),
-one for ``image`` and the other for ``label``. If the input image
-have multiple modalities with each modality saved in a single
-file, then the csv file should have N + 1 columns, where the
-first N columns are for the N modalities, and the last column
-is for the label. The following is an example for configuration of dataset.
-
-.. code-block:: none
-
- [dataset]
- # tensor type (float or double)
- tensor_type = float
- task_type = seg
- root_dir = ../../PyMIC_data/JSRT
- train_csv = config/jsrt_train.csv
- valid_csv = config/jsrt_valid.csv
- test_csv = config/jsrt_test.csv
- train_batch_size = 4
-
-
-To use your own dataset, you can define a dataset as a child class
-of ``NiftyDataset``, ``H5DataSet``, :mod:`or torch.utils.data.Dataset`
-, and use :mod:`SegmentationAgent.set_datasets()`
-to set the customized datasets. For example:
-
-.. code-block:: none
-
- from torch.utils.data import Dataset
- from pymic.net_run.agent_seg import SegmentationAgent
-
- class MyDataset(Dataset):
- ...
- # define your custom dataset here
-
- trainset, valset, testset = MyDataset(...), MyDataset(...), MyDataset(...)
- agent = SegmentationAgent(config, stage)
- agent.set_datasets(trainset, valset, testset)
- agent.run()
-
-Transforms
-----------
-
-Several transforms are defined in PyMIC to preprocess or augment the data
-before sending it to the network. The ``TransformDict`` in
-:mod:`pymic.transform.trans_dict` lists all the built-in transforms supported
-in PyMIC.
-
-In the configuration file, users can specify the transforms required for training,
-validation and testing data, respectively. The parameters of each tranform class
-should also be provided, such as following:
-
-.. code-block:: none
-
- # data transforms
- train_transform = [Pad, RandomRotate, RandomCrop, RandomFlip, NormalizeWithMeanStd, GammaCorrection, GaussianNoise, LabelToProbability]
- valid_transform = [NormalizeWithMeanStd, Pad, LabelToProbability]
- test_transform = [NormalizeWithMeanStd, Pad]
-
- # the inverse transform will be enabled during testing
- Pad_output_size = [8, 256, 256]
- Pad_ceil_mode = False
- Pad_inverse = True
-
- RandomRotate_angle_range_d = [-90, 90]
- RandomRotate_angle_range_h = None
- RandomRotate_angle_range_w = None
-
- RandomCrop_output_size = [6, 192, 192]
- RandomCrop_foreground_focus = False
- RandomCrop_foreground_ratio = None
- Randomcrop_mask_label = None
-
- RandomFlip_flip_depth = False
- RandomFlip_flip_height = True
- RandomFlip_flip_width = True
-
- NormalizeWithMeanStd_channels = [0]
-
- GammaCorrection_channels = [0]
- GammaCorrection_gamma_min = 0.7
- GammaCorrection_gamma_max = 1.5
-
- GaussianNoise_channels = [0]
- GaussianNoise_mean = 0
- GaussianNoise_std = 0.05
- GaussianNoise_probability = 0.5
-
-For spatial transforms, you can specify whether an inverse transform is enabled
-or not. Setting the inverse flag as True will transform the prediction output
-inversely during testing, such as ``Pad_inverse = True`` shown above.
-If you want to make images with different shapes to have the same shape before testing,
-then the correspoinding transform's inverse flag can be set as True, so
-that the prediction output will be transformed back to the original image space.
-This is also useful for test time augmentation.
-
-You can also define your own transform operations. To integrate your customized
-transform to the PyMIC pipeline, just add it to the ``TransformDict``, and you can
-also specify the parameters via a configuration file for the customized transform.
-The following is some example code for this:
-
-.. code-block:: none
-
- from pymic.transform.trans_dict import TransformDict
- from pymic.transform.abstract_transform import AbstractTransform
- from pymic.net_run.agent_seg import SegmentationAgent
-
- # customized transform
- class MyTransform(AbstractTransform):
- def __init__(self, params):
- super(MyTransform, self).__init__(params)
- ...
-
- def __call__(self, sample):
- ...
-
- def inverse_transform_for_prediction(self, sample):
- ...
-
- my_trans_dict = TransformDict
- my_trans_dict["MyTransform"] = MyTransform
- agent = SegmentationAgent(config, stage)
- agent.set_transform_dict(my_trans_dict)
- agent.run()
-
-Networks
---------
-
-The configuration file has a ``network`` section to specify the network's type and
-hyper-parameters. For example, the following is a configuration for using ``2DUNet``:
-
-.. code-block:: none
-
- [network]
- net_type = UNet2D
- # Parameters for UNet2D
- class_num = 2
- in_chns = 1
- feature_chns = [16, 32, 64, 128, 256]
- dropout = [0, 0, 0.3, 0.4, 0.5]
- bilinear = False
- multiscale_pred = False
-
-The ``SegNetDict`` in :mod:`pymic.net.net_dict_seg` lists all the built-in network
-structures currently implemented in PyMIC.
-
-You can also define your own networks. To integrate your customized
-network to the PyMIC pipeline, just call ``set_network()`` of ``SegmentationAgent``.
-The following is some example code for this:
-
-.. code-block:: none
-
- import torch.nn as nn
- from pymic.net_run.agent_seg import SegmentationAgent
-
- # customized network
- class MyNetwork(nn.Module):
- def __init__(self, params):
- super(MyNetwork, self).__init__()
- ...
-
- def forward(self, x):
- ...
-
- net = MyNetwork(params)
- agent = SegmentationAgent(config, stage)
- agent.set_network(net)
- agent.run()
-
-.. _fsl_loss:
-
-Loss Functions
---------------
-
-The setting of loss function is in the ``training`` section of the configuration file,
-where the loss function name and hyper-parameters should be provided.
-The ``SegLossDict`` in :mod:`pymic.loss.loss_dict_seg` lists all the built-in loss
-functions currently implemented in PyMIC.
-
-The following is an example of the setting of loss:
-
-.. code-block:: none
-
- loss_type = DiceLoss
- loss_softmax = True
-
-Note that PyMIC supports using a combination of loss functions. Just set ``loss_type``
-as a list of loss functions, and use ``loss_weight`` to specify the weight of each
-loss, such as the following:
-
-.. code-block:: none
-
- loss_type = [DiceLoss, CrossEntropyLoss]
- loss_weight = [0.5, 0.5]
-
-You can also define your own loss functions. To integrate your customized
-loss function to the PyMIC pipeline, just add it to the ``SegLossDict``, and you can
-also specify the parameters via a configuration file for the customized loss.
-The following is some example code for this:
-
-.. code-block:: none
-
- from pymic.loss.loss_dict_seg import SegLossDict
- from pymic.net_run.agent_seg import SegmentationAgent
-
- # customized loss
- class MyLoss(nn.Module):
- def __init__(self, params = None):
- super(MyLoss, self).__init__()
- ...
-
- def forward(self, loss_input_dict):
- ...
-
- my_loss_dict = SegLossDict
- my_loss_dict["MyLoss"] = MyLoss
- agent = SegmentationAgent(config, stage)
- agent.set_loss_dict(my_loss_dict)
- agent.run()
-
-
-Training Options
-----------------
-
-In addition to the loss fuction, users can specify several training
-options in the ``training`` section of the configuration file.
-
-Itreations
-^^^^^^^^^^
-
-For training iterations, the following parameters need to be specified in
-the configuration file:
-
-* ``iter_max``: the maximal allowed iteration for training.
-
-* ``iter_valid``: if the value is K, it means evaluating the performance on the
- validaiton set for every K steps.
-
-* ``iter_save``: The iteations for saving the model. If the value is k, it means
- the model will be saved every k iterations. It can also be a list of integer numbers,
- which specifies the iterations to save the model.
-
-* ``early_stop_patience``: if the value is k, it means the training will stop when
- the performance on the validation set does not improve for k iteations.
-
-
-Optimizer
-^^^^^^^^^
-
-For optimizer, users need to set ``optimizer``, ``learning_rate``,
-``momentum`` and ``weight_decay``. The built-in optimizers include ``SGD``,
-``Adam``, ``SparseAdam``, ``Adadelta``, ``Adagrad``, ``Adamax``, ``ASGD``,
-``LBFGS``, ``RMSprop`` and ``Rprop`` that are implemented in `torch.optim`.
-
-You can also use customized optimizers via `SegmentationAgent.set_optimizer()`.
-
-Learning Rate Scheduler
-^^^^^^^^^^^^^^^^^^^^^^^
-
-The current built-in learning rate schedulers are ``ReduceLROnPlateau``
-and ``MultiStepLR``, which can be specified in ``lr_scheduler`` in
-the configuration file.
-
-Parameters related to ``ReduceLROnPlateau`` include ``lr_gamma``.
-Parameters related to ``MultiStepLR`` include ``lr_gamma`` and ``lr_milestones``.
-
-You can also use customized lr schedulers via `SegmentationAgent.set_scheduler()`.
-
-Other Options
-^^^^^^^^^^^^^
-
-Other options for training include:
-
-* ``gpus``: a list of GPU index for training the model. If the length is larger than
- one (such as [0, 1]), it means the model will be trained on multiple GPUs parallelly.
-
-* ``deterministic`` (bool, default is True): set the training deterministic or not.
-
-* ``random_seed`` (int, optioinal): the random seed customized by user. Default value is 1.
-
-* ``ckpt_save_dir``: the path to the folder for saving the trained models.
-
-* ``ckpt_prefix``: the prefix of the name to save the checkpoints.
-
-
-Inference Options
------------------
-
-There are several options for inference after training the model. You can also select
-the GPUs for testing, enable sliding window inference or inference with
-test-time augmentation, etc. The following is a list of options availble for inference:
-
-* ``gpus``: a list of GPU index. Atually, only the first GPU in the list is used.
-
-* ``evaluation_mode`` (bool, default is True): set the model to evaluation mode or not.
-
-* ``test_time_dropout`` (bool, default is False): use test-time dropout or not.
-
-* ``ckpt_mode`` (int): which checkpoint is used. 0--the last checkpoint; 1--the checkpoint
- with the best performance on the validation set; 2--a specified checkpoint.
-
-* ``ckpt_name`` (string, optinal): the full path to the checkpoint if ckpt_mode = 2.
-
-* ``post_process`` (string, default is None): the post process method after inference.
- The current available post processing is :mod:`pymic.util.post_process.PostKeepLargestComponent`.
- Uses can also specify customized post process methods via `SegmentationAgent.set_postprocessor()`.
-
-* ``sliding_window_enable`` (bool, default is False): use sliding window for inference or not.
-
-* ``sliding_window_size`` (optinal): a list for sliding window size when sliding_window_enable = True.
-
-* ``sliding_window_stride`` (optinal): a list for sliding window stride when sliding_window_enable = True.
-
-* ``tta_mode`` (int, default is 0): the mode for Test Time Augmentation (TTA). 0--not using TTA; 1--using
- TTA based on horizontal and vertical flipping.
-
-* ``output_dir`` (string): the dir to save the prediction output.
-
-* ``ignore_dir`` (bool, default is True): if the input image name has a `/`, it will be replaced
- with `_` in the output file name.
-
-* ``save_probability`` (bool, default is False): save the output probability for each class.
-
-* ``label_source`` (list, default is None): a list of label to be converted after prediction. For example,
- `label_source` = [0, 1] and `label_target` = [0, 255] will convert label value from 1 to 255.
-
-* ``label_target`` (list, default is None): a list of label after conversion. Use this with `label_source`.
-
-* ``filename_replace_source`` (string, default is None): the substring in the filename will be replaced with
- a new substring specified by `filename_replace_target`.
-
-* ``filename_replace_target`` (string, default is None): work with `filename_replace_source`.
\ No newline at end of file
diff --git a/docs/source/usage.nll.rst b/docs/source/usage.nll.rst
deleted file mode 100644
index 0a87be9..0000000
--- a/docs/source/usage.nll.rst
+++ /dev/null
@@ -1,107 +0,0 @@
-.. _noisy_label_learning:
-
-Noisy Label Learning
-====================
-
-.. note::
-
- Some NLL methods only use noise-robust loss functions without complex
- training process, and just combining the standard :mod:`SegmentationAgent` with such
- loss function works for training.
-
-
-NLL Configurations
-------------------
-
-In the configuration file for noisy label learning, in addition to those used in standard fully
-supervised learning, there is a ``noisy_label_learning`` section that is specifically designed
-for NLL methods. In that section, users need to specify the ``method_name`` and configurations
-related to the NLL method. ``supervise_type`` should be set as "`noisy_label`" in the ``dataset`` section.
- For example, the correspoinding configuration for CoTeaching is:
-
-.. code-block:: none
-
- [dataset]
- ...
- supervise_type = noisy_label
- ...
-
- [network]
- ...
-
- [training]
- ...
-
- [noisy_label_learning]
- method_name = CoTeaching
- co_teaching_select_ratio = 0.8
- rampup_start = 1000
- rampup_end = 8000
-
- [testing]
- ...
-
-.. note::
-
- The configuration items vary with different NLL methods. Please refer to the API
- of each built-in NLL method for details of the correspoinding configuration.
- See examples in `PyMIC_examples/seg_nll/ `_.
-
-
-Built-in NLL Methods
---------------------
-
-Some NLL methods only use noise-robust loss functions. They are used with a standard fully supervised training
-paradigm. Just set ``supervise_type`` = `fully_sup`, and use ``loss_type`` to one of them in the configuration file:
-
-* ``GCELoss``: (`NeurIPS 2018 `_)
- Generalized cross entropy loss.
-
-* ``MAELoss``: (`AAAI 2017 `_)
- Mean Absolute Error loss.
-
-* ``NRDiceLoss``: (`TMI 2020 `_)
- Noise-robust Dice loss.
-
-The other NLL methods are implemented in child classes of
-:mod:`pymic.net_run.agent_seg.SegmentationAgent`, and they are:
-
-* ``CLSLSR``: (`MICCAI 2020 `_)
- Confident learning with spatial label smoothing regularization.
-
-* ``CoTeaching``: (`NeurIPS 2018 `_)
- Co-teaching between two networks for learning from noisy labels.
-
-* ``TriNet``: (`MICCAI 2020 `_)
- Tri-network combined with sample selection.
-
-* ``DAST``: (`JBHI 2022 `_)
- Divergence-aware selective training.
-
-Customized NLL Methods
-----------------------
-
-PyMIC alo supports customized NLL methods by inheriting the `SegmentationAgent` class.
-You may only need to rewrite the `training()` method and reuse most part of the
-existing pipeline, such as data loading, validation and inference methods. For example:
-
-.. code-block:: none
-
- from pymic.net_run.agent_seg import SegmentationAgent
-
- class MyNLLMethod(SegmentationAgent):
- def __init__(self, config, stage = 'train'):
- super(MyNLLMethod, self).__init__(config, stage)
- ...
-
- def training(self):
- ...
-
- agent = MyNLLMethod(config, stage)
- agent.run()
-
-You may need to check the source code of built-in NLL methods to be more familar with
-how to implement your own NLL method.
-
-In addition, if you want to design a new noise-robust loss fucntion,
-just follow :doc:`usage.fsl` to impelement and use the customized loss.
\ No newline at end of file
diff --git a/docs/source/usage.quickstart.rst b/docs/source/usage.quickstart.rst
deleted file mode 100644
index bced277..0000000
--- a/docs/source/usage.quickstart.rst
+++ /dev/null
@@ -1,177 +0,0 @@
-.. _quickstart:
-
-Quick Start
-===========
-
-
-Train and Test
---------------
-
-PyMIC accepts a configuration file for runing. For example, to train a network
-for segmentation with full supervision, run the fullowing command:
-
-.. code-block:: bash
-
- pymic_train myconfig.cfg
-
-After training, run the following command for testing:
-
-.. code-block:: bash
-
- pymic_test myconfig.cfg
-
-.. tip::
-
- We provide several examples in `PyMIC_examples. `_
- Please run these examples to quickly start with using PyMIC.
-
-
-.. _configuration:
-
-Configuration File
-------------------
-
-PyMIC uses configuration files to specify the setting and parameters of a deep
-learning pipeline, so that users can reuse the code and minimize their workload.
-Users can use configuration files to config almost all the componets involved,
-such as dataset, network structure, loss function, optimizer, learning rate
-scheduler and post processing methods, etc.
-
-.. note::
-
- Genreally, the configuration file have four sections: ``dataset``, ``network``,
- ``training`` and ``testing``.
-
-The following is an example configuration
-file used for segmentation of lung from radiograph, which can be find in
-`PyMIC_examples/segmentation/JSRT. `_
-
-.. code-block:: none
-
- [dataset]
- # tensor type (float or double)
- tensor_type = float
-
- task_type = seg
- root_dir = ../../PyMIC_data/JSRT
- train_csv = config/jsrt_train.csv
- valid_csv = config/jsrt_valid.csv
- test_csv = config/jsrt_test.csv
-
- train_batch_size = 4
-
- # data transforms
- train_transform = [NormalizeWithMeanStd, RandomCrop, LabelConvert, LabelToProbability]
- valid_transform = [NormalizeWithMeanStd, LabelConvert, LabelToProbability]
- test_transform = [NormalizeWithMeanStd]
-
- NormalizeWithMeanStd_channels = [0]
- RandomCrop_output_size = [240, 240]
-
- LabelConvert_source_list = [0, 255]
- LabelConvert_target_list = [0, 1]
-
-
- [network]
- # this section gives parameters for network
- # the keys may be different for different networks
-
- # type of network
- net_type = UNet2D
-
- # number of class, required for segmentation task
- class_num = 2
- in_chns = 1
- feature_chns = [16, 32, 64, 128, 256]
- dropout = [0, 0, 0.3, 0.4, 0.5]
- bilinear = False
- multiscale_pred = False
-
- [training]
- # list of gpus
- gpus = [0]
-
- loss_type = DiceLoss
-
- # for optimizers
- optimizer = Adam
- learning_rate = 1e-3
- momentum = 0.9
- weight_decay = 1e-5
-
- # for lr scheduler (MultiStepLR)
- lr_scheduler = MultiStepLR
- lr_gamma = 0.5
- lr_milestones = [2000, 4000, 6000]
-
- ckpt_save_dir = model/unet
- ckpt_prefix = unet
-
- # start iter
- iter_start = 0
- iter_max = 8000
- iter_valid = 200
- iter_save = 8000
-
- [testing]
- # list of gpus
- gpus = [0]
-
- # checkpoint mode can be [0-latest, 1-best, 2-specified]
- ckpt_mode = 0
- output_dir = result/unet
-
- # convert the label of prediction output
- label_source = [0, 1]
- label_target = [0, 255]
-
-
-Evaluation
-----------
-
-To evaluate a model's prediction results compared with the ground truth,
-use the ``pymic_eval_seg`` and ``pymic_eval_cls`` commands for segmentation
-and classfication tasks, respectively. Both of them accept a configuration
-file to specify the evaluation metrics, predicted results, ground truth and
-other information.
-
-For example, for segmentation tasks, run:
-
-.. code-block:: none
-
- pymic_eval_seg evaluation.cfg
-
-The configuration file is like (an example from
-`PyMIC_examples/seg_ssl/ACDC `_):
-
-.. code-block:: none
-
- [evaluation]
- metric_list = [dice, hd95]
- label_list = [1,2,3]
- organ_name = heart
-
- ground_truth_folder_root = ../../PyMIC_data/ACDC/preprocess
- segmentation_folder_root = result/unet2d_urpc
- evaluation_image_pair = config/data/image_test_gt_seg.csv
-
-See :mod:`pymic.util.evaluation_seg.evaluation` for details of the configuration required.
-
-For classification tasks, run:
-
-.. code-block:: none
-
- pymic_eval_cls evaluation.cfg
-
-The configuration file is like (an example from
-`PyMIC_examples/classification/CHNCXR `_):
-
-.. code-block:: none
-
- [evaluation]
- metric_list = [accuracy, auc]
- ground_truth_csv = config/cxr_test.csv
- predict_csv = result/resnet18.csv
- predict_prob_csv = result/resnet18_prob.csv
-
-See :mod:`pymic.util.evaluation_cls.main` for details of the configuration required.
diff --git a/docs/source/usage.rst b/docs/source/usage.rst
deleted file mode 100644
index 4a4af53..0000000
--- a/docs/source/usage.rst
+++ /dev/null
@@ -1,25 +0,0 @@
-Usage
-=====
-
-This usage gives details of how to use PyMIC.
-Beginners can easily start with training a deep learning
-model with configure files. When you are more familar with
-the PyMIC pipeline, you can define your customized modules
-and reuse the remaining parts of the pipeline, with minimal
-workload.
-
-.. toctree::
- :maxdepth: 2
-
- usage.quickstart
- usage.fsl
- usage.ssl
- usage.wsl
- usage.nll
-
-
-
-
-
-
-
diff --git a/docs/source/usage.ssl.rst b/docs/source/usage.ssl.rst
deleted file mode 100644
index 0fd8dc6..0000000
--- a/docs/source/usage.ssl.rst
+++ /dev/null
@@ -1,117 +0,0 @@
-.. _semi_supervised_learning:
-
-Semi-Supervised Learning
-=========================
-
-SSL Configurations
-------------------
-
-In the configuration file for semi-supervised segmentation, in addition to those used in fully
-supervised learning, there are some items specificalized for semi-supervised learning.
-
-Users should provide values for the following items in ``dataset`` section of
-the configuration file:
-
-* ``supervise_type`` (string): The value should be "`semi_sup`".
-
-* ``train_csv_unlab`` (string): the csv file for unlabeled dataset.
- Note that ``train_csv`` is only used for labeled dataset.
-
-* ``train_batch_size_unlab`` (int): the batch size for unlabeled dataset.
- Note that `train_batch_size` means the batch size for the labeled dataset.
-
-* ``train_transform_unlab`` (list): a list of transforms used for unlabeled data.
-
-
-The following is an example of the ``dataset`` section for semi-supervised learning:
-
-.. code-block:: none
-
- ...
-
- tensor_type = float
- task_type = seg
- supervise_type = semi_sup
-
- root_dir = ../../PyMIC_data/ACDC/preprocess/
- train_csv = config/data/image_train_r10_lab.csv
- train_csv_unlab = config/data/image_train_r10_unlab.csv
- valid_csv = config/data/image_valid.csv
- test_csv = config/data/image_test.csv
-
- train_batch_size = 4
- train_batch_size_unlab = 4
-
- # data transforms
- train_transform = [Pad, RandomRotate, RandomCrop, RandomFlip, NormalizeWithMeanStd, GammaCorrection, GaussianNoise, LabelToProbability]
- train_transform_unlab = [Pad, RandomRotate, RandomCrop, RandomFlip, NormalizeWithMeanStd, GammaCorrection, GaussianNoise]
- valid_transform = [NormalizeWithMeanStd, Pad, LabelToProbability]
- test_transform = [NormalizeWithMeanStd, Pad]
- ...
-
-In addition, there is a ``semi_supervised_learning`` section that is specifically designed
-for SSL methods. In that section, users need to specify the ``method_name`` and configurations
-related to the SSL method. For example, the correspoinding configuration for CPS is:
-
-.. code-block:: none
-
- ...
- [semi_supervised_learning]
- method_name = CPS
- regularize_w = 0.1
- rampup_start = 1000
- rampup_end = 20000
- ...
-
-.. note::
-
- The configuration items vary with different SSL methods. Please refer to the API
- of each built-in SSL method for details of the correspoinding configuration.
- See examples in `PyMIC_examples/seg_ssl/ `_.
-
-Built-in SSL Methods
---------------------
-
-:mod:`pymic.net_run.semi_sup.ssl_abstract.SSLSegAgent` is the abstract class used for
-semi-supervised learning. The built-in SSL methods are child classes of `SSLSegAgent`.
-The available SSL methods implemnted in PyMIC are listed in `pymic.net_run.semi_sup.SSLMethodDict`,
-and they are:
-
-* ``EntropyMinimization``: (`NeurIPS 2005 `_)
- Using entorpy minimization to regularize unannotated samples.
-
-* ``MeanTeacher``: (`NeurIPS 2017 `_) Use self-ensembling mean teacher to supervise the student model on
- unannotated samples.
-
-* ``UAMT``: (`MICCAI 2019 `_) Uncertainty aware mean teacher.
-
-* ``CCT``: (`CVPR 2020 `_) Cross-consistency training.
-
-* ``CPS``: (`CVPR 2021 `_) Cross-pseudo supervision.
-
-* ``URPC``: (`MIA 2022 `_) Uncertainty rectified pyramid consistency.
-
-Customized SSL Methods
-----------------------
-
-PyMIC alo supports customizing SSL methods by inheriting the `SSLSegAgent` class.
-You may only need to rewrite the `training()` method and reuse most part of the
-existing pipeline, such as data loading, validation and inference methods. For example:
-
-.. code-block:: none
-
- from pymic.net_run.semi_sup import SSLSegAgent
-
- class MySSLMethod(SSLSegAgent):
- def __init__(self, config, stage = 'train'):
- super(MySSLMethod, self).__init__(config, stage)
- ...
-
- def training(self):
- ...
-
- agent = MySSLMethod(config, stage)
- agent.run()
-
-You may need to check the source code of built-in SSL methods to be more familar with
-how to implement your own SSL method.
\ No newline at end of file
diff --git a/docs/source/usage.wsl.rst b/docs/source/usage.wsl.rst
deleted file mode 100644
index 10d6da2..0000000
--- a/docs/source/usage.wsl.rst
+++ /dev/null
@@ -1,130 +0,0 @@
-.. _weakly_supervised_learning:
-
-Weakly-Supervised Learning
-==========================
-
-.. note::
-
- Currently, the weakly supervised methods supported by PyMIC are only for learning
- from partial annotations, such scribble-based annotation. Learning from image-level
- or point annotations may involve several training stages and will be considered
- in the future.
-
-
-WSL Configurations
-------------------
-
-In the configuration file for weakly supervised learning, in addition to those used in fully
-supervised learning, there are some items specificalized for weakly-supervised learning.
-
-First, ``supervise_type`` should be set as "`weak_sup`" in the ``dataset`` section.
-
-Second, in the ``train_transform`` list, a special transform named `PartialLabelToProbability`
-should be used to transform patial labels into a one-hot probability map and a weighting
-map of pixels (i.e., the weight of a pixel is 1 if labeled and 0 otherwise). The patial
-cross entropy loss on labeled pixels is actually implemented by a weighted cross entropy loss.
-The loss setting is `loss_type = CrossEntropyLoss`.
-
-Thirdly, there is a ``weakly_supervised_learning`` section that is specifically designed
-for WSL methods. In that section, users need to specify the ``method_name`` and configurations
-related to the WSL method. For example, the correspoinding configuration for GatedCRF is:
-
-
-
-.. code-block:: none
-
- [dataset]
- ...
- supervise_type = weak_sup
- root_dir = ../../PyMIC_data/ACDC/preprocess
- train_csv = config/data/image_train.csv
- valid_csv = config/data/image_valid.csv
- test_csv = config/data/image_test.csv
-
- train_batch_size = 4
-
- # data transforms
- train_transform = [Pad, RandomCrop, RandomFlip, NormalizeWithMeanStd, PartialLabelToProbability]
- valid_transform = [NormalizeWithMeanStd, Pad, LabelToProbability]
- test_transform = [NormalizeWithMeanStd, Pad]
- ...
-
- [network]
- ...
-
- [training]
- ...
- loss_type = CrossEntropyLoss
- ...
-
- [weakly_supervised_learning]
- method_name = GatedCRF
- regularize_w = 0.1
- rampup_start = 2000
- rampup_end = 15000
- GatedCRFLoss_W0 = 1.0
- GatedCRFLoss_XY0 = 5
- GatedCRFLoss_rgb = 0.1
- GatedCRFLoss_W1 = 1.0
- GatedCRFLoss_XY1 = 3
- GatedCRFLoss_Radius = 5
-
- [testing]
- ...
-
-.. note::
-
- The configuration items vary with different WSL methods. Please refer to the API
- of each built-in WSL method for details of the correspoinding configuration.
- See examples in `PyMIC_examples/seg_wsl/ `_.
-
-Built-in WSL Methods
---------------------
-
-:mod:`pymic.net_run.weak_sup.wsl_abstract.WSLSegAgent` is the abstract class used for
-weakly-supervised learning. The built-in WSL methods are child classes of `WSLSegAgent`.
-The available WSL methods implemnted in PyMIC are listed in `pymic.net_run.weak_sup.WSLMethodDict`,
-and they are:
-
-* ``EntropyMinimization``: (`NeurIPS 2005 `_)
- Using entorpy minimization to regularize unannotated pixels.
-
-* ``GatedCRF``: (`arXiv 2019 `_)
- Use gated CRF to regularize unannotated pixels.
-
-* ``TotalVariation``: (`arXiv 2022 `_)
- Use Total Variation to regularize unannotated pixels.
-
-* ``MumfordShah``: (`TIP 2020 `_)
- Use Mumford Shah loss to regularize unannotated pixels.
-
-* ``USTM``: (`PR 2022 `_)
- Adapt USTM with transform-consistency regularization.
-
-* ``DMPLS``: (`MICCAI 2022 `_)
- Dynamically mixed pseudo label supervision
-
-Customized WSL Methods
-----------------------
-
-PyMIC alo supports customizing WSL methods by inheriting the `WSLSegAgent` class.
-You may only need to rewrite the `training()` method and reuse most part of the
-existing pipeline, such as data loading, validation and inference methods. For example:
-
-.. code-block:: none
-
- from pymic.net_run.weak_sup import WSLSegAgent
-
- class MyWSLMethod(WSLSegAgent):
- def __init__(self, config, stage = 'train'):
- super(MyWSLMethod, self).__init__(config, stage)
- ...
-
- def training(self):
- ...
-
- agent = MyWSLMethod(config, stage)
- agent.run()
-
-You may need to check the source code of built-in WSL methods to be more familar with
-how to implement your own WSL method.
\ No newline at end of file
diff --git a/index.md b/index.md
new file mode 100644
index 0000000..0aef59d
--- /dev/null
+++ b/index.md
@@ -0,0 +1,39 @@
+## Welcome to PyMIC
+
+This page is under construction, we will update it later.
+
+You can use the [editor on GitHub](https://github.com/HiLab-git/PyMIC/edit/gh-pages/index.md) to maintain and preview the content for your website in Markdown files.
+
+Whenever you commit to this repository, GitHub Pages will run [Jekyll](https://jekyllrb.com/) to rebuild the pages in your site, from the content in your Markdown files.
+
+### Markdown
+
+Markdown is a lightweight and easy-to-use syntax for styling your writing. It includes conventions for
+
+```markdown
+Syntax highlighted code block
+
+# Header 1
+## Header 2
+### Header 3
+
+- Bulleted
+- List
+
+1. Numbered
+2. List
+
+**Bold** and _Italic_ and `Code` text
+
+[Link](url) and 
+```
+
+For more details see [Basic writing and formatting syntax](https://docs.github.com/en/github/writing-on-github/getting-started-with-writing-and-formatting-on-github/basic-writing-and-formatting-syntax).
+
+### Jekyll Themes
+
+Your Pages site will use the layout and styles from the Jekyll theme you have selected in your [repository settings](https://github.com/HiLab-git/PyMIC/settings/pages). The name of this theme is saved in the Jekyll `_config.yml` configuration file.
+
+### Support or Contact
+
+Having trouble with Pages? Check out our [documentation](https://docs.github.com/categories/github-pages-basics/) or [contact support](https://support.github.com/contact) and we’ll help you sort it out.
diff --git a/pymic/__init__.py b/pymic/__init__.py
deleted file mode 100644
index ae1775d..0000000
--- a/pymic/__init__.py
+++ /dev/null
@@ -1,19 +0,0 @@
-from __future__ import absolute_import
-from enum import Enum
-
-__version__ = "0.5.0" # 2024.11.15
-
-class TaskType(Enum):
- CLASSIFICATION_ONE_HOT = 1
- CLASSIFICATION_COEXIST = 2
- REGRESSION = 3
- SEGMENTATION = 4
- RECONSTRUCTION = 5
-
-TaskDict = {
- 'cls': TaskType.CLASSIFICATION_ONE_HOT,
- 'cls_coexist': TaskType.CLASSIFICATION_COEXIST,
- 'regress': TaskType.REGRESSION,
- 'seg': TaskType.SEGMENTATION,
- 'rec': TaskType.RECONSTRUCTION
-}
\ No newline at end of file
diff --git a/pymic/io/__init__.py b/pymic/io/__init__.py
deleted file mode 100644
index 7f94f61..0000000
--- a/pymic/io/__init__.py
+++ /dev/null
@@ -1,4 +0,0 @@
-from __future__ import absolute_import
-from pymic.io.image_read_write import *
-from pymic.io.nifty_dataset import *
-from pymic.io.h5_dataset import *
\ No newline at end of file
diff --git a/pymic/io/h5_dataset.py b/pymic/io/h5_dataset.py
deleted file mode 100644
index 02e9724..0000000
--- a/pymic/io/h5_dataset.py
+++ /dev/null
@@ -1,105 +0,0 @@
-# -*- coding: utf-8 -*-
-
-from logging import root
-import os
-import torch
-import random
-import h5py
-import pandas as pd
-from torch.utils.data import Dataset
-from torch.utils.data.sampler import Sampler
-from pymic import TaskType
-
-class H5DataSet_backup(Dataset):
- """
- Dataset for loading images stored in h5 format. It generates
- 4D tensors with dimension order [C, D, H, W] for 3D images, and
- 3D tensors with dimension order [C, H, W] for 2D images
-
- Args:
- root_dir (str): thr root dir of images. \n
- sample_list_name (str): a file name for sample list. \n
- tranform (list): A list of transform objects applied on a sample.
- """
- def __init__(self, root_dir, sample_list_name, transform = None):
- self.root_dir = root_dir
- self.transform = transform
- with open(sample_list_name, 'r') as f:
- lines = f.readlines()
- self.sample_list = [item.replace('\n', '') for item in lines]
-
- def __len__(self):
- return len(self.sample_list)
-
- def __getitem__(self, idx):
- sample_name = self.sample_list[idx]
- h5f = h5py.File(self.root_dir + '/' + sample_name, 'r')
- image = h5f['image'][:]
- label = h5f['label'][:]
- sample = {'image': image, 'label': label}
- if self.transform:
- sample = self.transform(sample)
- return sample
-
-
-
-class TwoStreamBatchSampler(Sampler):
- """Iterate two sets of indices
-
- An 'epoch' is one iteration through the primary indices.
- During the epoch, the secondary indices are iterated through
- as many times as needed.
- """
-
- def __init__(self, primary_indices, secondary_indices, batch_size, secondary_batch_size):
- self.primary_indices = primary_indices
- self.secondary_indices = secondary_indices
- self.secondary_batch_size = secondary_batch_size
- self.primary_batch_size = batch_size - secondary_batch_size
-
- assert len(self.primary_indices) >= self.primary_batch_size > 0
- assert len(self.secondary_indices) >= self.secondary_batch_size > 0
-
- def __iter__(self):
- primary_iter = iterate_once(self.primary_indices)
- secondary_iter = iterate_eternally(self.secondary_indices)
- return (
- primary_batch + secondary_batch
- for (primary_batch, secondary_batch)
- in zip(grouper(primary_iter, self.primary_batch_size),
- grouper(secondary_iter, self.secondary_batch_size))
- )
-
- def __len__(self):
- return len(self.primary_indices) // self.primary_batch_size
-
-
-def iterate_once(iterable):
- return np.random.permutation(iterable)
-
-
-def iterate_eternally(indices):
- def infinite_shuffles():
- while True:
- yield np.random.permutation(indices)
- return itertools.chain.from_iterable(infinite_shuffles())
-
-
-def grouper(iterable, n):
- "Collect data into fixed-length chunks or blocks"
- # grouper('ABCDEFG', 3) --> ABC DEF"
- args = [iter(iterable)] * n
- return zip(*args)
-
-
-if __name__ == "__main__":
- root_dir = "/home/guotai/disk2t/projects/semi_supervise/SSL4MIS/data/ACDC/data/slices"
- file_name = "/home/guotai/disk2t/projects/semi_supervise/slices.txt"
- dataset = H5DataSet(root_dir, file_name)
- train_loader = torch.utils.data.DataLoader(dataset,
- batch_size = 4, shuffle=True, num_workers= 1)
- for sample in train_loader:
- image = sample['image']
- label = sample['label']
- print(image.shape, label.shape)
- print(image.min(), image.max(), label.max())
\ No newline at end of file
diff --git a/pymic/io/image_read_write.py b/pymic/io/image_read_write.py
deleted file mode 100644
index f570628..0000000
--- a/pymic/io/image_read_write.py
+++ /dev/null
@@ -1,214 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-import logging
-import os
-import numpy as np
-import SimpleITK as sitk
-from PIL import Image
-
-def load_nifty_volume_as_4d_array(filename):
- """
- Read a nifty image and return a dictionay storing data array, origin,
- spacing and direction.\n
- output['data_array'] 4D array with shape [C, D, H, W];\n
- output['spacing'] A list of spacing in z, y, x axis;\n
- output['direction'] A 3x3 matrix for direction.
-
- :param filename: (str) The input file name
- :return: A dictionay storing data array, origin, spacing and direction.
- """
- img_obj = sitk.ReadImage(filename)
- data_array = sitk.GetArrayFromImage(img_obj)
- origin = img_obj.GetOrigin()
- spacing = img_obj.GetSpacing()
- direction = img_obj.GetDirection()
- shape = data_array.shape
- if(len(shape) == 3):
- data_array = np.expand_dims(data_array, axis = 0)
- elif(len(shape) > 4 or len(shape) < 3):
- raise ValueError("unsupported image dim: {0:}".format(len(shape)))
- output = {}
- output['data_array'] = data_array
- output['origin'] = origin
- output['spacing'] = (spacing[2], spacing[1], spacing[0])
- output['direction'] = direction
- return output
-
-def load_rgb_image_as_3d_array(filename):
- """
- Read an RGB image and return a dictionay storing data array, origin,
- spacing and direction. \n
- output['data_array'] 3D array with shape [D, H, W]; \n
- output['spacing'] a list of spacing in z, y, x axis; \n
- output['direction'] a 3x3 matrix for direction.
-
- :param filename: (str) The input file name
- :return: A dictionay storing data array, origin, spacing and direction.
- """
- image = np.asarray(Image.open(filename))
- image_shape = image.shape
- image_dim = len(image_shape)
- assert(image_dim == 2 or image_dim == 3)
- if(image_dim == 2):
- image = np.expand_dims(image, axis = 0)
- else:
- # transpose rgb image from [H, W, C] to [C, H, W]
- # logging.warning("The image is expected to have 1 or three channels, but it has a different channel number")
- # logging.warning("({0:} {1:}".format(filename, image_shape))
- if(image_shape[2] == 4):
- image = image[:, :, range(3)]
- elif(image_shape[2] == 2):
- image = image[:, :, 0:1]
- elif(image_shape[2] != 3):
- raise ValueError("invalid channel number {0:}", image_shape[2])
- image = np.transpose(image, axes = [2, 0, 1])
-
- output = {}
- output['data_array'] = image
- output['origin'] = (0, 0)
- output['spacing'] = (1.0, 1.0)
- output['direction'] = 0
- return output
-
-def load_image_as_nd_array(image_name):
- """
- Load an image and return a 4D array with shape [C, D, H, W],
- or 3D array with shape [C, H, W].
-
- :param filename: (str) The input file name
- :return: A dictionay storing data array, origin, spacing and direction.
- """
- if (image_name.endswith(".nii.gz") or image_name.endswith(".nii") or
- image_name.endswith(".mha")):
- image_dict = load_nifty_volume_as_4d_array(image_name)
- elif(image_name.lower().endswith(".jpg") or image_name.lower().endswith(".jpeg") or
- image_name.lower().endswith(".tif") or image_name.lower().endswith(".png")):
- image_dict = load_rgb_image_as_3d_array(image_name)
- else:
- raise ValueError("unsupported image format: {0:}".format(image_name))
- return image_dict
-
-def save_array_as_nifty_volume(data, image_name, reference_name = None, spacing = [1.0,1.0,1.0]):
- """
- Save a numpy array as nifty image
-
- :param data: (numpy.ndarray) A numpy array with shape [Depth, Height, Width].
- :param image_name: (str) The ouput file name.
- :param reference_name: (str) File name of the reference image of which
- meta information is used.
- :param spacing: (list or tuple) the spacing of a volume data when `reference_name` is not provided.
- """
- img = sitk.GetImageFromArray(data)
- if((reference_name is not None) and (not reference_name.endswith(".h5"))):
- img_ref = sitk.ReadImage(reference_name)
- #img.CopyInformation(img_ref)
- img.SetSpacing(img_ref.GetSpacing())
- img.SetOrigin(img_ref.GetOrigin())
- direction0 = img_ref.GetDirection()
- direction1 = img.GetDirection()
- if(len(direction0) == len(direction1)):
- img.SetDirection(direction0)
- else:
- nifty_spacing = spacing[1:] + spacing[:1]
- img.SetSpacing(nifty_spacing)
- sitk.WriteImage(img, image_name)
-
-def save_array_as_rgb_image(data, image_name):
- """
- Save a numpy array as rgb image.
-
- :param data: (numpy.ndarray) A numpy array with shape [3, H, W] or
- [H, W, 3] or [H, W].
- :param image_name: (str) The output file name.
- """
- data_dim = len(data.shape)
- if(data_dim == 3):
- assert(data.shape[0] == 3 or data.shape[2] == 3)
- if(data.shape[0] == 3):
- data = np.transpose(data, [1, 2, 0])
- img = Image.fromarray(data)
- img.save(image_name)
-
-def save_nd_array_as_image(data, image_name, reference_name = None, spacing = [1.0,1.0,1.0]):
- """
- Save a 3D or 2D numpy array as medical image or RGB image
-
- :param data: (numpy.ndarray) A numpy array with shape [3, H, W] or
- [H, W, 3] or [H, W].
- :param reference_name: (str) File name of the reference image of which
- meta information is used.
- :param spacing: (list or tuple) the spacing of a volume data when `reference_name` is not provided.
- """
- data_dim = len(data.shape)
- assert(data_dim == 2 or data_dim == 3)
- if(image_name.endswith(".h5")):
- if(data_dim == 3):
- image_name = image_name.replace(".h5", ".nii.gz")
- else:
- image_name = image_name.replace(".h5", ".png")
- if (image_name.endswith(".nii.gz") or image_name.endswith(".nii") or
- image_name.endswith(".mha")):
- assert(data_dim == 3)
- save_array_as_nifty_volume(data, image_name, reference_name, spacing)
- elif(image_name.endswith(".jpg") or image_name.endswith(".jpeg") or
- image_name.endswith(".tif") or image_name.endswith(".png")):
- assert(data_dim == 2)
- save_array_as_rgb_image(data, image_name)
- else:
- raise ValueError("unsupported image format {0:}".format(
- image_name.split('.')[-1]))
-
-def rotate_nifty_volume_to_LPS(filename_or_image_dict, origin = None, direction = None):
- '''
- Rotate the axis of a 3D volume to LPS
-
- :param filename_or_image_dict: (str) Filename of the nifty file (str) or image dictionary
- returned by load_nifty_volume_as_4d_array. If supplied with the former,
- the flipped image data will be saved to override the original file.
- If supplied with the later, only flipped image data will be returned.\n
- :param origin: (list/tuple) The origin of the image.
- :param direction: (list or tuple) The direction of the image.
-
- :return: A dictionary for image data and meta info, with ``data_array``,
- ``origin``, ``direction`` and ``spacing``.
- '''
-
- if type(filename_or_image_dict) == str:
- image_data = load_nifty_volume_as_4d_array(filename_or_image_dict)
- save_nifty = True
- elif type(filename_or_image_dict) == dict:
- image_data = filename_or_image_dict
- save_nifty = False
-
- data_array = image_data['data_array']
- if not origin:
- origin = image_data['origin']
- if not direction:
- direction = image_data['direction']
- spacing = image_data['spacing']
-
- fliped = False
- if direction[0] == -1.:
- data_array = np.flip(data_array, axis = 3)
- fliped = True
- if direction[4] == -1.:
- data_array = np.flip(data_array, axis = 2)
- fliped = True
- if direction[8] == -1.:
- data_array = np.flip(data_array, axis = 1)
- fliped = True
-
- if save_nifty:
- if not fliped:
- return
- else:
- print(f'rotate {filename_or_image_dict} to LPS')
- img = sitk.GetImageFromArray(data_array[0])
- img.SetSpacing(spacing)
- img.SetOrigin(origin)
- img.SetDirection([1., 0., 0., 0., 1., 0., 0., 0., 1.])
- sitk.WriteImage(img, filename_or_image_dict)
- else:
- image_data['data_array'] = data_array
- image_data['direction'] = [1., 0., 0., 0., 1., 0., 0., 0., 1.]
- return image_data
diff --git a/pymic/io/nifty_dataset.py b/pymic/io/nifty_dataset.py
deleted file mode 100644
index 5424e91..0000000
--- a/pymic/io/nifty_dataset.py
+++ /dev/null
@@ -1,256 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-
-import logging
-import os
-import h5py
-import pandas as pd
-import numpy as np
-from torch.utils.data import Dataset
-from pymic import TaskType
-from pymic.io.image_read_write import load_image_as_nd_array
-
-def check_and_expand_dim(x, img_dim):
- """
- check the input dim and expand it with a channel dimension if necessary.
- For 2D images, return a 3D numpy array with a shape of [C, H, W]
- for 3D images, return a 3D numpy array with a shape of [C, D, H, W]
- """
- input_dim = len(x.shape)
- if(input_dim == 2 and img_dim == 2):
- x = np.expand_dims(x, axis = 0)
- elif(input_dim == 3 and img_dim == 3):
- x = np.expand_dims(x, axis = 0)
- return x
-
-class NiftyDataset(Dataset):
- """
- Dataset for loading images for segmentation. It generates 4D tensors with
- dimention order [C, D, H, W] for 3D images, and 3D tensors
- with dimention order [C, H, W] for 2D images.
-
- :param root_dir: (str) Directory with all the images.
- :param csv: (str) Path to the csv file with image names. If it is None,
- the images will be those under root_dir. This only works for testing with
- a single input modality. If the images are stored in h5 files, the *.csv file
- only has one column, while for other types of images such as .nii.gz and.png,
- each column is for an input modality, and the last column is for label.
- :param modal_num: (int) Number of modalities. This is only used if the data_file is *.csv.
- :param image_dim: (int) Spacial dimension of the input image. This is ony used for h5 files.
- :param with_label: (bool) Load the data with segmentation ground truth or not.
- :param transform: (list) List of transforms to be applied on a sample.
- The built-in transforms can listed in :mod:`pymic.transform.trans_dict`.
- """
- def __init__(self, root_dir, csv_file, modal_num = 1, image_dim = 3,
- allow_missing_modal = False, label_key = "label",
- transform=None, task = TaskType.SEGMENTATION):
- self.root_dir = root_dir
- if(csv_file is not None):
- self.csv_items = pd.read_csv(csv_file)
- else:
- img_names = os.listdir(root_dir)
- img_names = [item for item in img_names if ("nii" in item or "jpg" in item or
- "jpeg" in item or "bmp" in item or "png" in item)]
- csv_dict = {"image":img_names}
- self.csv_items = pd.DataFrame.from_dict(csv_dict)
-
- self.modal_num = modal_num
- self.image_dim = image_dim
- self.allow_emtpy= allow_missing_modal
- self.label_key = label_key
- self.transform = transform
- self.task = task
- self.h5files = False
- self.with_label = True
- assert self.task in [TaskType.SEGMENTATION, TaskType.RECONSTRUCTION]
-
- # check if the files are h5 images, and if the labels are provided.
- temp_name = self.csv_items.iloc[0, 0]
- logging.warning(temp_name)
- if(temp_name.endswith(".h5")):
- self.h5files = True
- temp_full_name = "{0:}/{1:}".format(self.root_dir, temp_name)
- h5f = h5py.File(temp_full_name, 'r')
- if(self.label_key not in h5f):
- self.with_label = False
- else:
- csv_keys = list(self.csv_items.keys())
- if(self.label_key not in csv_keys):
- self.with_label = False
-
- self.image_weight_idx = None
- self.pixel_weight_idx = None
- if('image_weight' in csv_keys):
- self.image_weight_idx = csv_keys.index('image_weight')
- if('pixel_weight' in csv_keys):
- self.pixel_weight_idx = csv_keys.index('pixel_weight')
- if(not self.with_label):
- logging.warning("`label` section is not found in the csv file {0:}".format(
- csv_file) + " or the corresponding h5 file." +
- "\n -- This is only allowed for self-supervised learning" +
- "\n -- when `SelfSuperviseLabel` is used in the transform, or when" +
- "\n -- loading the unlabeled data for preprocessing.")
-
- def __len__(self):
- return len(self.csv_items)
-
- def __getlabel__(self, idx):
- csv_keys = list(self.csv_items.keys())
- label_idx = csv_keys.index(self.label_key)
- label_name = self.csv_items.iloc[idx, label_idx]
- label_name_full = "{0:}/{1:}".format(self.root_dir, label_name)
- label = load_image_as_nd_array(label_name_full)['data_array']
- if(self.task == TaskType.SEGMENTATION):
- label = np.asarray(label, np.int32)
- elif(self.task == TaskType.RECONSTRUCTION):
- label = np.asarray(label, np.float32)
- return label, label_name
-
- def __get_pixel_weight__(self, idx):
- weight_name = "{0:}/{1:}".format(self.root_dir,
- self.csv_items.iloc[idx, self.pixel_weight_idx])
- weight = load_image_as_nd_array(weight_name)['data_array']
- weight = np.asarray(weight, np.float32)
- return weight
-
- # def __getitem__(self, idx):
- # sample_name = self.csv_items.iloc[idx, 0]
- # h5f = h5py.File(self.root_dir + '/' + sample_name, 'r')
- # image = np.asarray(h5f['image'][:], np.float32)
-
- # # this a temporaory process, will be delieted later
- # if(len(image.shape) == 3 and image.shape[0] > 1):
- # image = np.expand_dims(image, 0)
- # sample = {'image': image, 'names':sample_name}
-
- # if('label' in h5f):
- # label = np.asarray(h5f['label'][:], np.uint8)
- # if(len(label.shape) == 3 and label.shape[0] > 1):
- # label = np.expand_dims(label, 0)
- # sample['label'] = label
- # if self.transform:
- # sample = self.transform(sample)
- # return sample
-
- def __getitem__(self, idx):
- names_list, image_list = [], []
- image_shape = None
- if(self.h5files):
- sample_name = self.csv_items.iloc[idx, 0]
- h5f = h5py.File(self.root_dir + '/' + sample_name, 'r')
- img = check_and_expand_dim(h5f['image'][:], self.image_dim)
- sample = {'image':img}
- if(self.with_label):
- lab = check_and_expand_dim(h5f[self.label_key][:], self.image_dim)
- sample['label'] = np.asarray(lab, np.float32)
- sample['names'] = [sample_name]
- else:
- for i in range (self.modal_num):
- image_name = self.csv_items.iloc[idx, i]
- image_full_name = "{0:}/{1:}".format(self.root_dir, image_name)
- if(os.path.exists(image_full_name)):
- image_dict = load_image_as_nd_array(image_full_name)
- image_data = image_dict['data_array']
- elif(self.allow_emtpy and image_shape is not None):
- image_data = np.zeros(image_shape)
- else:
- raise KeyError("File not found: {0:}".format(image_full_name))
- if(i == 0):
- image_shape = image_data.shape
- names_list.append(image_name)
- image_list.append(image_data)
- image = np.concatenate(image_list, axis = 0)
- image = np.asarray(image, np.float32)
-
- sample = {'image': image, 'names' : names_list,
- 'origin':image_dict['origin'],
- 'spacing': image_dict['spacing'],
- 'direction':image_dict['direction']}
- if (self.with_label):
- sample['label'], label_name = self.__getlabel__(idx)
- sample['names'].append(label_name)
- assert(image.shape[1:] == sample['label'].shape[1:])
- if (self.image_weight_idx is not None):
- sample['image_weight'] = self.csv_items.iloc[idx, self.image_weight_idx]
- if (self.pixel_weight_idx is not None):
- sample['pixel_weight'] = self.__get_pixel_weight__(idx)
- assert(image.shape[1:] == sample['pixel_weight'].shape[1:])
- if self.transform:
- sample = self.transform(sample)
-
- return sample
-
-
-class ClassificationDataset(Dataset):
- """
- Dataset for loading images for classification. It generates 4D tensors with
- dimention order [C, D, H, W] for 3D images, and 3D tensors
- with dimention order [C, H, W] for 2D images.
-
- :param root_dir: (str) Directory with all the images.
- :param csv_file: (str) Path to the csv file with image names.
- :param modal_num: (int) Number of modalities.
- :param class_num: (int) Class number of the classificaiton task.
- :param with_label: (bool) Load the data with segmentation ground truth or not.
- :param transform: (list) List of transforms to be applied on a sample.
- The built-in transforms can listed in :mod:`pymic.transform.trans_dict`.
- """
- def __init__(self, root_dir, csv_file, modal_num = 1, class_num = 2,
- with_label = False, transform=None, task = TaskType.CLASSIFICATION_ONE_HOT):
- # super(ClassificationDataset, self).__init__(root_dir,
- # csv_file, modal_num, with_label, transform, task)
- self.root_dir = root_dir
- self.csv_items = pd.read_csv(csv_file)
- self.modal_num = modal_num
- self.with_label = with_label
- self.transform = transform
- self.class_num = class_num
- self.task = task
- assert self.task in [TaskType.CLASSIFICATION_ONE_HOT, TaskType.CLASSIFICATION_COEXIST]
-
- csv_keys = list(self.csv_items.keys())
- self.image_weight_idx = None
- if('image_weight' in csv_keys):
- self.image_weight_idx = csv_keys.index('image_weight')
-
- def __len__(self):
- return len(self.csv_items)
-
- def __getlabel__(self, idx):
- csv_keys = list(self.csv_items.keys())
- if self.task == TaskType.CLASSIFICATION_ONE_HOT:
- label_idx = csv_keys.index('label')
- label = self.csv_items.iloc[idx, label_idx]
- else:
- label = np.asarray(self.csv_items.iloc[idx, 1:self.class_num + 1], np.float32)
- return label
-
- def __getweight__(self, idx):
- weight = self.csv_items.iloc[idx, self.image_weight_idx]
- weight = weight + 0.0
- return weight
-
- def __getitem__(self, idx):
- names_list, image_list = [], []
- for i in range (self.modal_num):
- image_name = self.csv_items.iloc[idx, i]
- image_full_name = "{0:}/{1:}".format(self.root_dir, image_name)
- image_dict = load_image_as_nd_array(image_full_name)
- image_data = image_dict['data_array']
- names_list.append(image_name)
- image_list.append(image_data)
- image = np.concatenate(image_list, axis = 0)
- image = np.asarray(image, np.float32)
- sample = {'image': image, 'names' : names_list[0],
- 'origin':image_dict['origin'],
- 'spacing': image_dict['spacing'],
- 'direction':image_dict['direction']}
-
- if (self.with_label):
- label = self.__getlabel__(idx)
- sample['label'] = label #np.asarray(label, np.float32)
- if (self.image_weight_idx is not None):
- sample['image_weight'] = self.__getweight__(idx)
- if self.transform:
- sample = self.transform(sample)
- return sample
diff --git a/pymic/layer/__init__.py b/pymic/layer/__init__.py
deleted file mode 100644
index 72b8078..0000000
--- a/pymic/layer/__init__.py
+++ /dev/null
@@ -1,2 +0,0 @@
-from __future__ import absolute_import
-from . import *
\ No newline at end of file
diff --git a/pymic/layer/activation.py b/pymic/layer/activation.py
deleted file mode 100644
index a33e4ec..0000000
--- a/pymic/layer/activation.py
+++ /dev/null
@@ -1,76 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-
-import torch
-import torch.nn as nn
-
-
-def get_acti_func(acti_func, params):
- acti_func = acti_func.lower()
- if(acti_func == 'relu'):
- inplace = params.get('relu_inplace', False)
- return nn.ReLU(inplace)
-
- elif(acti_func == 'leakyrelu'):
- slope = params.get('leakyrelu_negative_slope', 1e-2)
- inplace = params.get('leakyrelu_inplace', False)
- return nn.LeakyReLU(slope, inplace)
-
- elif(acti_func == 'prelu'):
- num_params = params.get('prelu_num_parameters', 1)
- init_value = params.get('prelu_init', 0.25)
- return nn.PReLU(num_params, init_value)
-
- elif(acti_func == 'rrelu'):
- lower = params.get('rrelu_lower', 1.0 /8)
- upper = params.get('rrelu_upper', 1.0 /3)
- inplace = params.get('rrelu_inplace', False)
- return nn.RReLU(lower, upper, inplace)
-
- elif(acti_func == 'elu'):
- alpha = params.get('elu_alpha', 1.0)
- inplace = params.get('elu_inplace', False)
- return nn.ELU(alpha, inplace)
-
- elif(acti_func == 'celu'):
- alpha = params.get('celu_alpha', 1.0)
- inplace = params.get('celu_inplace', False)
- return nn.CELU(alpha, inplace)
-
- elif(acti_func == 'selu'):
- inplace = params.get('selu_inplace', False)
- return nn.SELU(inplace)
-
- elif(acti_func == 'glu'):
- dim = params.get('glu_dim', -1)
- return nn.GLU(dim)
-
- elif(acti_func == 'sigmoid'):
- return nn.Sigmoid()
-
- elif(acti_func == 'logsigmoid'):
- return nn.LogSigmoid()
-
- elif(acti_func == 'tanh'):
- return nn.Tanh()
-
- elif(acti_func == 'hardtanh'):
- min_val = params.get('hardtanh_min_val', -1.0)
- max_val = params.get('hardtanh_max_val', 1.0)
- inplace = params.get('hardtanh_inplace', False)
- return nn.Hardtanh(min_val, max_val, inplace)
-
- elif(acti_func == 'softplus'):
- beta = params.get('softplus_beta', 1.0)
- threshold = params.get('softplus_threshold', 20)
- return nn.Softplus(beta, threshold)
-
- elif(acti_func == 'softshrink'):
- lambd = params.get('softshrink_lambda', 0.5)
- return nn.Softshrink(lambd)
-
- elif(acti_func == 'softsign'):
- return nn.Softsign()
-
- else:
- raise ValueError("Not implemented: {0:}".format(acti_func))
\ No newline at end of file
diff --git a/pymic/layer/convolution.py b/pymic/layer/convolution.py
deleted file mode 100644
index 50e8b47..0000000
--- a/pymic/layer/convolution.py
+++ /dev/null
@@ -1,127 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-
-import torch
-import torch.nn as nn
-
-class ConvolutionLayer(nn.Module):
- """
- A compose layer with the following components:
- convolution -> (batch_norm / layer_norm / group_norm / instance_norm) -> (activation) -> (dropout)
- Batch norm and activation are optional.
-
- :param in_channels: (int) The input channel number.
- :param out_channels: (int) The output channel number.
- :param kernel_size: The size of convolution kernel. It can be either a single
- int or a tupe of two or three ints.
- :param dim: (int) The dimention of convolution (2 or 3).
- :param stride: (int) The stride of convolution.
- :param padding: (int) Padding size.
- :param dilation: (int) Dilation rate.
- :param conv_group: (int) The groupt number of convolution.
- :param bias: (bool) Add bias or not for convolution.
- :param norm_type: (str or None) Normalization type, can be `batch_norm`, 'group_norm'.
- :param norm_group: (int) The number of group for group normalization.
- :param acti_func: (str or None) Activation funtion.
- """
- def __init__(self, in_channels, out_channels, kernel_size, dim = 3,
- stride = 1, padding = 0, dilation = 1, conv_group = 1, bias = True,
- norm_type = 'batch_norm', norm_group = 1, acti_func = None):
- super(ConvolutionLayer, self).__init__()
- self.n_in_chns = in_channels
- self.n_out_chns = out_channels
- self.norm_type = norm_type
- self.norm_group = norm_group
- self.acti_func = acti_func
-
- assert(dim == 2 or dim == 3)
- if(dim == 2):
- self.conv = nn.Conv2d(in_channels, out_channels,
- kernel_size, stride, padding, dilation, conv_group, bias)
- if(self.norm_type == 'batch_norm'):
- self.bn = nn.BatchNorm2d(out_channels)
- elif(self.norm_type == 'group_norm'):
- self.bn = nn.GroupNorm(self.norm_group, out_channels)
- elif(self.norm_type is not None):
- raise ValueError("unsupported normalization method {0:}".format(norm_type))
- else:
- self.conv = nn.Conv3d(in_channels, out_channels,
- kernel_size, stride, padding, dilation, conv_group, bias)
- if(self.norm_type == 'batch_norm'):
- self.bn = nn.BatchNorm3d(out_channels)
- elif(self.norm_type == 'group_norm'):
- self.bn = nn.GroupNorm(self.norm_group, out_channels)
- elif(self.norm_type is not None):
- raise ValueError("unsupported normalization method {0:}".format(norm_type))
-
- def forward(self, x):
- f = self.conv(x)
- if(self.norm_type is not None):
- f = self.bn(f)
- if(self.acti_func is not None):
- f = self.acti_func(f)
- return f
-
-class DepthSeperableConvolutionLayer(nn.Module):
- """
- Depth seperable convolution with the following components:
- 1x1 conv -> group conv -> (batch_norm / layer_norm / group_norm / instance_norm) -> (activation) -> (dropout)
- Batch norm and activation are optional.
-
- :param in_channels: (int) The input channel number.
- :param out_channels: (int) The output channel number.
- :param kernel_size: The size of convolution kernel. It can be either a single
- int or a tupe of two or three ints.
- :param dim: (int) The dimention of convolution (2 or 3).
- :param stride: (int) The stride of convolution.
- :param padding: (int) Padding size.
- :param dilation: (int) Dilation rate.
- :param conv_group: (int) The groupt number of convolution.
- :param bias: (bool) Add bias or not for convolution.
- :param norm_type: (str or None) Normalization type, can be `batch_norm`, 'group_norm'.
- :param norm_group: (int) The number of group for group normalization.
- :param acti_func: (str or None) Activation funtion.
- """
- def __init__(self, in_channels, out_channels, kernel_size, dim = 3,
- stride = 1, padding = 0, dilation =1, conv_group = 1, bias = True,
- norm_type = 'batch_norm', norm_group = 1, acti_func = None):
- super(DepthSeperableConvolutionLayer, self).__init__()
- self.n_in_chns = in_channels
- self.n_out_chns = out_channels
- self.norm_type = norm_type
- self.norm_group = norm_group
- self.acti_func = acti_func
-
- assert(dim == 2 or dim == 3)
- if(dim == 2):
- self.conv1x1 = nn.Conv2d(in_channels, out_channels,
- kernel_size = 1, stride = stride, padding = 0, dilation = dilation, groups = conv_group, bias = bias)
- self.conv = nn.Conv2d(out_channels, out_channels,
- kernel_size, stride, padding, dilation, groups = out_channels, bias = bias)
- if(self.norm_type == 'batch_norm'):
- self.bn = nn.BatchNorm2d(out_channels)
- elif(self.norm_type == 'group_norm'):
- self.bn = nn.GroupNorm(self.norm_group, out_channels)
- elif(self.norm_type is not None):
- raise ValueError("unsupported normalization method {0:}".format(norm_type))
- else:
- self.conv1x1 = nn.Conv3d(in_channels, out_channels,
- kernel_size = 1, stride = stride, padding = 0, dilation = dilation, groups = conv_group, bias = bias)
- self.conv = nn.Conv3d(out_channels, out_channels,
- kernel_size, stride, padding, dilation, groups = out_channels, bias = bias)
- if(self.norm_type == 'batch_norm'):
- self.bn = nn.BatchNorm3d(out_channels)
- elif(self.norm_type == 'group_norm'):
- self.bn = nn.GroupNorm(self.norm_group, out_channels)
- elif(self.norm_type is not None):
- raise ValueError("unsupported normalization method {0:}".format(norm_type))
-
- def forward(self, x):
- f = self.conv1x1(x)
- f = self.conv(f)
- if(self.norm_type is not None):
- f = self.bn(f)
- if(self.acti_func is not None):
- f = self.acti_func(f)
- return f
-
diff --git a/pymic/layer/deconvolution.py b/pymic/layer/deconvolution.py
deleted file mode 100644
index 20c83c1..0000000
--- a/pymic/layer/deconvolution.py
+++ /dev/null
@@ -1,116 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-
-import torch
-import torch.nn as nn
-
-class DeconvolutionLayer(nn.Module):
- """
- A compose layer with the following components:
- deconvolution -> (batch_norm / layer_norm / group_norm / instance_norm) -> (activation) -> (dropout)
- Batch norm and activation are optional.
-
- :param in_channels: (int) The input channel number.
- :param out_channels: (int) The output channel number.
- :param kernel_size: The size of convolution kernel. It can be either a single
- int or a tupe of two or three ints.
- :param dim: (int) The dimention of convolution (2 or 3).
- :param stride: (int) The stride of convolution.
- :param padding: (int) Padding size.
- :param dilation: (int) Dilation rate.
- :param groups: (int) The groupt number of convolution.
- :param bias: (bool) Add bias or not for convolution.
- :param batch_norm: (bool) Use batch norm or not.
- :param acti_func: (str or None) Activation funtion.
- """
- def __init__(self, in_channels, out_channels, kernel_size,
- dim = 3, stride = 1, padding = 0, output_padding = 0,
- dilation =1, groups = 1, bias = True,
- batch_norm = True, acti_func = None):
- super(DeconvolutionLayer, self).__init__()
- self.n_in_chns = in_channels
- self.n_out_chns = out_channels
- self.batch_norm = batch_norm
- self.acti_func = acti_func
-
- assert(dim == 2 or dim == 3)
- if(dim == 2):
- self.conv = nn.ConvTranspose2d(in_channels, out_channels,
- kernel_size, stride, padding, output_padding,
- groups, bias, dilation)
- if(self.batch_norm):
- self.bn = nn.BatchNorm2d(out_channels)
- else:
- self.conv = nn.ConvTranspose3d(in_channels, out_channels,
- kernel_size, stride, padding, output_padding,
- groups, bias, dilation)
- if(self.batch_norm):
- self.bn = nn.BatchNorm3d(out_channels)
-
- def forward(self, x):
- f = self.conv(x)
- if(self.batch_norm):
- f = self.bn(f)
- if(self.acti_func is not None):
- f = self.acti_func(f)
- return f
-
-class DepthSeperableDeconvolutionLayer(nn.Module):
- """
- Depth seperable deconvolution with the following components:
- 1x1 conv -> deconv -> (batch_norm / layer_norm / group_norm / instance_norm) -> (activation) -> (dropout)
- Batch norm and activation are optional.
-
- :param in_channels: (int) The input channel number.
- :param out_channels: (int) The output channel number.
- :param kernel_size: The size of convolution kernel. It can be either a single
- int or a tupe of two or three ints.
- :param dim: (int) The dimention of convolution (2 or 3).
- :param stride: (int) The stride of convolution.
- :param padding: (int) Padding size for input.
- :param output_padding: (int) Padding size for ouput.
- :param dilation: (int) Dilation rate.
- :param groups: (int) The groupt number of convolution.
- :param bias: (bool) Add bias or not for convolution.
- :param batch_norm: (bool) Use batch norm or not.
- :param acti_func: (str or None) Activation funtion.
- """
- def __init__(self, in_channels, out_channels, kernel_size,
- dim = 3, stride = 1, padding = 0, output_padding = 0,
- dilation =1, groups = 1, bias = True,
- batch_norm = True, acti_func = None):
- super(DepthSeperableDeconvolutionLayer, self).__init__()
- self.n_in_chns = in_channels
- self.n_out_chns = out_channels
- self.batch_norm = batch_norm
- self.acti_func = acti_func
- self.groups = groups
- assert(dim == 2 or dim == 3)
- if(dim == 2):
- self.conv1x1 = nn.Conv2d(in_channels, out_channels,
- kernel_size = 1, stride = 1, padding = 0, dilation = dilation,
- groups = self.groups, bias = bias)
- self.conv = nn.ConvTranspose2d(out_channels, out_channels,
- kernel_size, stride, padding, output_padding,
- groups = out_channels, bias = bias, dilation = dilation)
-
- if(self.batch_norm):
- self.bn = nn.BatchNorm2d(out_channels)
- else:
- self.conv1x1 = nn.Conv3d(in_channels, out_channels,
- kernel_size = 1, stride = 1, padding = 0, dilation = dilation,
- groups = self.groups, bias = bias)
- self.conv = nn.ConvTranspose3d(out_channels, out_channels,
- kernel_size, stride, padding, output_padding,
- groups = out_channels, bias = bias, dilation = dilation)
- if(self.batch_norm):
- self.bn = nn.BatchNorm3d(out_channels)
-
- def forward(self, x):
- f = self.conv1x1(x)
- f = self.conv(f)
- if(self.batch_norm):
- f = self.bn(f)
- if(self.acti_func is not None):
- f = self.acti_func(f)
- return f
\ No newline at end of file
diff --git a/pymic/layer/space2channel.py b/pymic/layer/space2channel.py
deleted file mode 100644
index 79981d8..0000000
--- a/pymic/layer/space2channel.py
+++ /dev/null
@@ -1,96 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-
-import numpy as np
-import torch
-import torch.nn as nn
-import SimpleITK as sitk
-
-class SpaceToChannel3D(nn.Module):
- """
- Space to channel transform for 3D input."""
- def __init__(self):
- super(SpaceToChannel3D, self).__init__()
-
- def forward(self, x):
- # only 3D images (5D tensor is support)
- input_shape = list(x.shape)
- assert(len(input_shape) == 5)
- [B,C, D, H, W] = input_shape
- assert((D % 2 == 0) and (H % 2 == 0) and (W % 2 == 0))
- halfD = int(D/2)
- halfH = int(H/2)
- halfW = int(W/2)
- # split along D axis
- x1 = x.contiguous().view([B, C, halfD, 2, H, W])
- # permute to [B, C, 2, halfD, H, W]
- x2 = x1.permute(0, 1, 3, 2, 4, 5)
- # view as [B, 2*C, halfD, H, W] and [B, C*2, halfD, halfH, 2, W]
- x3 = x2.contiguous().view([B, C*2, halfD, halfH, 2, W])
- # permute to [B, C*2, 2, halfD, halfH, W]
- x4 = x3.permute(0, 1, 4, 2, 3, 5)
- # view as [B, C*4, halfD, halfH, W] and [B, C*4, halfD, halfH, halfW, 2]
- x5 = x4.contiguous().view([B, C*4, halfD, halfH, halfW, 2])
- # permute to [B, C*4, 2, halfD, halfH, halfW]
- x6 = x5.permute(0, 1, 5, 2, 3, 4)
- x7 = x6.contiguous().view([B, C*8, halfD, halfH, halfW])
- return x7
-
-class ChannelToSpace3D(nn.Module):
- """
- Channel to space transform for 3D input."""
- def __init__(self):
- super(ChannelToSpace3D, self).__init__()
-
- def forward(self, x):
- # only 3D images (5D tensor is support)
- input_shape = list(x.shape)
- assert(len(input_shape) == 5)
- [B,C, D, H, W] = input_shape
- assert(C % 8 == 0)
- Cd8 = int(C/8)
- Cd4 = 2 * Cd8
- Cd2 = 2 * Cd4
- x6 = x.contiguous().view([B, Cd2, 2, D, H, W])
- # permute to [B, Cd4, D, H, W, 2]
- x5 = x6.permute(0, 1, 3, 4, 5, 2)
- x4 = x5.contiguous().view([B, Cd4, 2, D, H, 2*W])
- # permute to [B, Cd2, D, H, 2, 2*W]
- x3 = x4.permute(0, 1, 3, 4, 2, 5)
- x2 = x3.contiguous().view([B, Cd8, 2, D, 2* H, 2*W])
- x1 = x2.permute(0, 1, 3, 2, 4, 5)
- x0 = x1.contiguous().view([B, Cd8, 2*D, 2* H, 2*W])
- return x0
-
-
-if __name__ == "__main__":
- s2c = SpaceToChannel3D()
- s2c = s2c.double()
-
- c2s = ChannelToSpace3D()
- c2s = c2s.double()
-
- img_name = "/home/disk2t/data/brats/BraTS2018_Training/HGG/Brats18_2013_2_1/Brats18_2013_2_1_flair.nii.gz"
- img_obj = sitk.ReadImage(img_name)
- img_data = sitk.GetArrayFromImage(img_obj)
- img_data = img_data[:-1]
- print(img_data.shape)
- x = img_data.reshape([1, 1] + list(img_data.shape))
- # x = np.random.rand(4, 4, 96, 96, 96)
- xt = torch.from_numpy(x)
- xt = torch.tensor(xt)
-
- y = s2c(xt)
- z = c2s(y)
- y = y.detach().numpy()[0]
- print(y.shape)
- for i in range(8):
- sub_img = sitk.GetImageFromArray(y[i])
- # sub_img.CopyInformation(img_obj)
- save_name = "../../temp/{0:}.nii.gz".format(i)
- sitk.WriteImage(sub_img, save_name)
- z = z.detach().numpy()[0]
- print(z.shape)
- rec_img = sitk.GetImageFromArray(z[0])
- save_name = "../../temp/rec.nii.gz"
- sitk.WriteImage(rec_img, save_name)
\ No newline at end of file
diff --git a/pymic/loss/__init__.py b/pymic/loss/__init__.py
deleted file mode 100644
index 72b8078..0000000
--- a/pymic/loss/__init__.py
+++ /dev/null
@@ -1,2 +0,0 @@
-from __future__ import absolute_import
-from . import *
\ No newline at end of file
diff --git a/pymic/loss/cls/__init__.py b/pymic/loss/cls/__init__.py
deleted file mode 100644
index 72b8078..0000000
--- a/pymic/loss/cls/__init__.py
+++ /dev/null
@@ -1,2 +0,0 @@
-from __future__ import absolute_import
-from . import *
\ No newline at end of file
diff --git a/pymic/loss/cls/basic.py b/pymic/loss/cls/basic.py
deleted file mode 100644
index 6b71e23..0000000
--- a/pymic/loss/cls/basic.py
+++ /dev/null
@@ -1,101 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-
-import torch
-import torch.nn as nn
-
-class AbstractClassificationLoss(nn.Module):
- """
- Abstract Classification Loss.
- """
- def __init__(self, params = None):
- super(AbstractClassificationLoss, self).__init__()
-
- def forward(self, loss_input_dict):
- """
- The arguments should be written in the `loss_input_dict` dictionary, and it has the
- following fields.
-
- :param prediction: A prediction with shape of [N, C] where C is the class number.
- :param ground_truth: The corresponding ground truth, with shape of [N, 1].
-
- Note that `prediction` is the digit output of a network, before using softmax.
- """
- pass
-
-class CrossEntropyLoss(AbstractClassificationLoss):
- """
- Standard Softmax-based CE loss.
- """
- def __init__(self, params = None):
- super(CrossEntropyLoss, self).__init__(params)
- self.ce_loss = nn.CrossEntropyLoss()
-
- def forward(self, loss_input_dict):
- predict = loss_input_dict['prediction']
- labels = loss_input_dict['ground_truth']
- loss = self.ce_loss(predict, labels)
- return loss
-
-class SigmoidCELoss(AbstractClassificationLoss):
- """
- Sigmoid-based CE loss, should be used when task_type = cls_coexist
- """
- def __init__(self, params = None):
- super(SigmoidCELoss, self).__init__(params)
-
- def forward(self, loss_input_dict):
- predict = loss_input_dict['prediction']
- labels = loss_input_dict['ground_truth']
- predict = nn.Sigmoid()(predict) * 0.999 + 5e-4
- loss = - labels * torch.log(predict) - (1 - labels) * torch.log( 1 - predict)
- loss = loss.mean()
- return loss
-
-class L1Loss(AbstractClassificationLoss):
- """
- L1 (MAE) loss for classification
- """
- def __init__(self, params = None):
- super(L1Loss, self).__init__(params)
- self.l1_loss = nn.L1Loss()
-
- def forward(self, loss_input_dict):
- predict = loss_input_dict['prediction']
- labels = loss_input_dict['ground_truth'][:, None] # reshape to N, 1
- softmax = nn.Softmax(dim = 1)
- predict = softmax(predict)
- loss = self.l1_loss(predict, labels)
- return loss
-
-class MSELoss(AbstractClassificationLoss):
- """
- Mean Square Error loss for classification.
- """
- def __init__(self, params = None):
- super(MSELoss, self).__init__(params)
- self.mse_loss = nn.MSELoss()
-
- def forward(self, loss_input_dict):
- predict = loss_input_dict['prediction']
- labels = loss_input_dict['ground_truth'][:, None] # reshape to N, 1
- softmax = nn.Softmax(dim = 1)
- predict = softmax(predict)
- loss = self.mse_loss(predict, labels)
- return loss
-
-class NLLLoss(AbstractClassificationLoss):
- """
- The negative log likelihood loss for classification.
- """
- def __init__(self, params = None):
- super(NLLLoss, self).__init__(params)
- self.nll_loss = nn.NLLLoss()
-
- def forward(self, loss_input_dict):
- predict = loss_input_dict['prediction']
- labels = loss_input_dict['ground_truth']
- logsoft = nn.LogSoftmax(dim = 1)
- predict = logsoft(predict)
- loss = self.nll_loss(predict, labels)
- return loss
\ No newline at end of file
diff --git a/pymic/loss/cls/infoNCE.py b/pymic/loss/cls/infoNCE.py
deleted file mode 100644
index fb6f1c1..0000000
--- a/pymic/loss/cls/infoNCE.py
+++ /dev/null
@@ -1,39 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-
-import torch
-import torch.nn as nn
-
-class InfoNCELoss(nn.Module):
- """
- Abstract Classification Loss.
- """
- def __init__(self, params = None):
- super(InfoNCELoss, self).__init__()
- self.temp = params.get("temperature", 0.1)
-
- def forward(self, input_1, input_2):
- """
- The arguments should be written in the `loss_input_dict` dictionary, and it has the
- following fields.
-
- :param prediction: A prediction with shape of [N, C] where C is the class number.
- :param ground_truth: The corresponding ground truth, with shape of [N, 1].
-
- Note that `prediction` is the digit output of a network, before using softmax.
- """
- B = list(input_1.shape)[0]
- loss = 0.0
- for b in range(B):
- embeds_1 = input_1[b]
- embeds_2 = input_2[b]
- logits_11 = torch.matmul(embeds_1, embeds_1.T) / self.temp
- logits_11.fill_diagonal_(float('-inf'))
- logits_12 = torch.matmul(embeds_1, embeds_2.T) / self.temp
- logits_22 = torch.matmul(embeds_2, embeds_2.T) / self.temp
- logits_22.fill_diagonal_(float('-inf'))
- loss_1 = torch.mean(-logits_12.diag() + torch.logsumexp(torch.cat([logits_11, logits_12], dim=1), dim=1))
- loss_2 = torch.mean(-logits_12.diag() + torch.logsumexp(torch.cat([logits_12.T, logits_22], dim=1), dim=1))
- loss = loss + (loss_1 + loss_2) / 2
- loss = loss / B
- return loss
\ No newline at end of file
diff --git a/pymic/loss/cls/util.py b/pymic/loss/cls/util.py
deleted file mode 100644
index 87e2e55..0000000
--- a/pymic/loss/cls/util.py
+++ /dev/null
@@ -1,29 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-
-import torch
-import torch.nn as nn
-import numpy as np
-
-def get_soft_label(input_tensor, num_class, data_type = 'float'):
- """
- Convert a label tensor to one-hot soft label.
-
- :param input_tensor: Tensor with shape of [B, 1].
- :param output_tensor: Tensor with shape of [B, num_class].
- :param num_class: (int) Class number.
- :param data_type: (str) `float` or `double`.
- """
- tensor_list = []
- for i in range(num_class):
- temp_prob = input_tensor == i*torch.ones_like(input_tensor)
- tensor_list.append(temp_prob)
- output_tensor = torch.cat(tensor_list, dim = 1)
- if(data_type == 'float'):
- output_tensor = output_tensor.float()
- elif(data_type == 'double'):
- output_tensor = output_tensor.double()
- else:
- raise ValueError("data type can only be float and double: {0:}".format(data_type))
-
- return output_tensor
\ No newline at end of file
diff --git a/pymic/loss/loss_dict_cls.py b/pymic/loss/loss_dict_cls.py
deleted file mode 100644
index 44744cb..0000000
--- a/pymic/loss/loss_dict_cls.py
+++ /dev/null
@@ -1,20 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-Built-in loss functions for classification.
-
-* CrossEntropyLoss :mod:`pymic.loss.cls.basic.CrossEntropyLoss`
-* SigmoidCELoss :mod:`pymic.loss.cls.basic.SigmoidCELoss`
-* L1Loss :mod:`pymic.loss.cls.basic.L1Loss`
-* MSELoss :mod:`pymic.loss.cls.basic.MSELoss`
-* NLLLoss :mod:`pymic.loss.cls.basic.NLLLoss`
-
-"""
-from __future__ import print_function, division
-from pymic.loss.cls.basic import *
-from pymic.loss.cls.infoNCE import InfoNCELoss
-PyMICClsLossDict = {"CrossEntropyLoss": CrossEntropyLoss,
- "SigmoidCELoss": SigmoidCELoss,
- 'InfoNCELoss': InfoNCELoss,
- "L1Loss": L1Loss,
- "MSELoss": MSELoss,
- "NLLLoss": NLLLoss}
diff --git a/pymic/loss/loss_dict_seg.py b/pymic/loss/loss_dict_seg.py
deleted file mode 100644
index 36e6a21..0000000
--- a/pymic/loss/loss_dict_seg.py
+++ /dev/null
@@ -1,47 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-Built-in loss functions for segmentation.
-The following are for fully supervised learning, or learnig from noisy labels:
-
-* CrossEntropyLoss :mod:`pymic.loss.seg.ce.CrossEntropyLoss`
-* GeneralizedCELoss :mod:`pymic.loss.seg.ce.GeneralizedCELoss`
-* DiceLoss :mod:`pymic.loss.seg.dice.DiceLoss`
-* FocalDiceLoss :mod:`pymic.loss.seg.dice.FocalDiceLoss`
-* NoiseRobustDiceLoss :mod:`pymic.loss.seg.dice.NoiseRobustDiceLoss`
-* ExpLogLoss :mod:`pymic.loss.seg.exp_log.ExpLogLoss`
-* MAELoss :mod:`pymic.loss.seg.mse.MAELoss`
-* MSELoss :mod:`pymic.loss.seg.mse.MSELoss`
-* SLSRLoss :mod:`pymic.loss.seg.slsr.SLSRLoss`
-
-The following are for semi-supervised or weakly supervised learning:
-
-* EntropyLoss :mod:`pymic.loss.seg.ssl.EntropyLoss`
-* GatedCRFLoss: :mod:`pymic.loss.seg.gatedcrf.GatedCRFLoss`
-* MumfordShahLoss :mod:`pymic.loss.seg.mumford_shah.MumfordShahLoss`
-* TotalVariationLoss :mod:`pymic.loss.seg.ssl.TotalVariationLoss`
-"""
-from __future__ import print_function, division
-import torch.nn as nn
-from pymic.loss.seg.ce import CrossEntropyLoss, GeneralizedCELoss
-from pymic.loss.seg.dice import DiceLoss, FocalDiceLoss, \
- NoiseRobustDiceLoss, BinaryDiceLoss, GroupDiceLoss
-from pymic.loss.seg.exp_log import ExpLogLoss
-from pymic.loss.seg.ars_tversky import ARSTverskyLoss
-from pymic.loss.seg.mse import MSELoss, MAELoss
-from pymic.loss.seg.slsr import SLSRLoss
-
-SegLossDict = {
- 'CrossEntropyLoss': CrossEntropyLoss,
- 'GeneralizedCELoss': GeneralizedCELoss,
- 'DiceLoss': DiceLoss,
- 'BinaryDiceLoss': BinaryDiceLoss,
- 'FocalDiceLoss': FocalDiceLoss,
- 'ARSTverskyLoss': ARSTverskyLoss,
- 'NoiseRobustDiceLoss': NoiseRobustDiceLoss,
- 'GroupDiceLoss': GroupDiceLoss,
- 'ExpLogLoss': ExpLogLoss,
- 'MAELoss': MAELoss,
- 'MSELoss': MSELoss,
- 'SLSRLoss': SLSRLoss
- }
-
diff --git a/pymic/loss/seg/__init__.py b/pymic/loss/seg/__init__.py
deleted file mode 100644
index 72b8078..0000000
--- a/pymic/loss/seg/__init__.py
+++ /dev/null
@@ -1,2 +0,0 @@
-from __future__ import absolute_import
-from . import *
\ No newline at end of file
diff --git a/pymic/loss/seg/abstract.py b/pymic/loss/seg/abstract.py
deleted file mode 100644
index 68643e8..0000000
--- a/pymic/loss/seg/abstract.py
+++ /dev/null
@@ -1,48 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-
-import torch
-import torch.nn as nn
-
-class AbstractSegLoss(nn.Module):
- """
- Abstract class for loss function of segmentation tasks.
- The parameters should be written in the `params` dictionary, and it has the
- following fields:
-
- :param `loss_softmax`: (optional, bool)
- Apply softmax to the prediction of network or not. Default is True.
- """
- def __init__(self, params = None):
- super(AbstractSegLoss, self).__init__()
- if(params is None):
- self.acti_func = 'softmax'
- else:
- self.acti_func = params.get('loss_acti_func', 'softmax')
-
- def get_activated_prediction(self, p, acti_func = 'softmax'):
- if(acti_func == "softmax"):
- p = nn.Softmax(dim = 1)(p)
- elif(acti_func == "tanh"):
- p = nn.Tanh()(p)
- elif(acti_func == "sigmoid"):
- p = nn.Sigmoid()(p)
- else:
- raise ValueError("activation for output is not supported: {0:}".format(acti_func))
- return p
-
- def forward(self, loss_input_dict):
- """
- Forward pass for calculating the loss.
- The arguments should be written in the `loss_input_dict` dictionary,
- and it has the following fields:
-
- :param `prediction`: (tensor) Prediction of a network, with the
- shape of [N, C, D, H, W] or [N, C, H, W].
- :param `ground_truth`: (tensor) Ground truth, with the
- shape of [N, C, D, H, W] or [N, C, H, W].
- :param `pixel_weight`: (optional) Pixel-wise weight map, with the
- shape of [N, 1, D, H, W] or [N, 1, H, W]. Default is None.
- :return: Loss function value.
- """
- pass
diff --git a/pymic/loss/seg/ars_tversky.py b/pymic/loss/seg/ars_tversky.py
deleted file mode 100644
index 4fafeae..0000000
--- a/pymic/loss/seg/ars_tversky.py
+++ /dev/null
@@ -1,67 +0,0 @@
-
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-
-import torch.nn as nn
-from pymic.loss.seg.abstract import AbstractSegLoss
-
-class ARSTverskyLoss(AbstractSegLoss):
- """
- The Adaptive Region-Specific Loss in this paper:
-
- * Y. Chen et al.: Adaptive Region-Specific Loss for Improved Medical Image Segmentation.
- `IEEE TPAMI 2023. `_
-
- The arguments should be written in the `params` dictionary, and it has the
- following fields:
-
- :param `ARSTversky_patch_size`: (list) the patch size.
- :param `A`: the lowest weight for FP or FN (default 0.3)
- :param `B`: the gap between lowest and highest weight (default 0.4)
- """
- def __init__(self, params):
- super(ARSTverskyLoss, self).__init__(params)
- self.patch_size = params['ARSTversky_patch_size'.lower()]
- self.a = params.get('ARSTversky_a'.lower(), 0.3)
- self.b = params.get('ARSTversky_b'.lower(), 0.4)
-
- self.dim = len(self.patch_size)
- assert self.dim in [2, 3], "The num of dim must be 2 or 3."
- if self.dim == 3:
- self.pool = nn.AvgPool3d(kernel_size=self.patch_size, stride=self.patch_size)
- elif self.dim == 2:
- self.pool = nn.AvgPool2d(kernel_size=self.patch_size, stride=self.patch_size)
-
- def forward(self, loss_input_dict):
- predict = loss_input_dict['prediction']
- soft_y = loss_input_dict['ground_truth']
-
- if(isinstance(predict, (list, tuple))):
- predict = predict[0]
- if(self.acti_func is not None):
- predict = self.get_activated_prediction(predict, self.acti_func)
-
- smooth = 1e-5
- if self.dim == 2:
- assert predict.shape[-2] % self.patch_size[0] == 0, "image size % patch size must be 0 in dimension y"
- assert predict.shape[-1] % self.patch_size[1] == 0, "image size % patch size must be 0 in dimension x"
- elif self.dim == 3:
- assert predict.shape[-3] % self.patch_size[0] == 0, "image size % patch size must be 0 in dimension z"
- assert predict.shape[-2] % self.patch_size[1] == 0, "image size % patch size must be 0 in dimension y"
- assert predict.shape[-1] % self.patch_size[2] == 0, "image size % patch size must be 0 in dimension x"
-
- tp = predict * soft_y
- fp = predict * (1 - soft_y)
- fn = (1 - predict) * soft_y
-
- region_tp = self.pool(tp)
- region_fp = self.pool(fp)
- region_fn = self.pool(fn)
-
- alpha = self.a + self.b * (region_fp + smooth) / (region_fp + region_fn + smooth)
- beta = self.a + self.b * (region_fn + smooth) / (region_fp + region_fn + smooth)
-
- region_tversky = (region_tp + smooth) / (region_tp + alpha * region_fp + beta * region_fn + smooth)
- region_tversky = 1 - region_tversky
- loss = region_tversky.mean()
- return loss
\ No newline at end of file
diff --git a/pymic/loss/seg/ce.py b/pymic/loss/seg/ce.py
deleted file mode 100644
index bf036a3..0000000
--- a/pymic/loss/seg/ce.py
+++ /dev/null
@@ -1,96 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-
-import torch
-import torch.nn as nn
-from pymic.loss.seg.abstract import AbstractSegLoss
-from pymic.loss.seg.util import reshape_tensor_to_2D
-
-class CrossEntropyLoss(AbstractSegLoss):
- """
- Cross entropy loss for segmentation tasks.
-
- The parameters should be written in the `params` dictionary, and it has the
- following fields:
-
- :param `loss_acti_func`: (optional, string)
- Apply an activation function to the prediction of network or not, for example,
- 'softmax' for image segmentation tasks, 'tanh' for reconstruction tasks, and None
- means no activation is used.
- """
- def __init__(self, params = None):
- super(CrossEntropyLoss, self).__init__(params)
-
- def forward(self, loss_input_dict):
- predict = loss_input_dict['prediction']
- soft_y = loss_input_dict['ground_truth']
- pix_w = loss_input_dict.get('pixel_weight', None)
- cls_w = loss_input_dict.get('class_weight', None)
-
- if(isinstance(predict, (list, tuple))):
- predict = predict[0]
- if(self.acti_func is not None):
- predict = self.get_activated_prediction(predict, self.acti_func)
-
- predict = reshape_tensor_to_2D(predict)
- soft_y = reshape_tensor_to_2D(soft_y)
-
- # for numeric stability
- # predict = predict * (1-1e-10) + 0.5e-10
- ce = - soft_y* torch.log(predict)
- if(cls_w is not None):
- ce = torch.sum(ce*cls_w, dim = 1)
- else:
- ce = torch.sum(ce, dim = 1) # shape is [N]
- if(pix_w is None):
- ce = torch.mean(ce)
- else:
- pix_w = torch.squeeze(reshape_tensor_to_2D(pix_w))
- ce = torch.sum(pix_w * ce) / (pix_w.sum() + 1e-10)
- return ce
-
-class GeneralizedCELoss(AbstractSegLoss):
- """
- Generalized cross entropy loss to deal with noisy labels.
-
- * Reference: Z. Zhang et al. Generalized Cross Entropy Loss for Training Deep Neural Networks
- with Noisy Labels, NeurIPS 2018.
-
- The parameters should be written in the `params` dictionary, and it has the
- following fields:
-
- :param `loss_softmax`: (bool) Apply softmax to the prediction of network or not.
- :param `loss_gce_q`: (float): hyper-parameter in the range of (0, 1).
- :param `loss_with_pixel_weight`: (optional, bool): Use pixel weighting or not.
- :param `loss_class_weight`: (optional, list or none): If not none, a list of weight for each class.
-
- """
- def __init__(self, params):
- super(GeneralizedCELoss, self).__init__(params)
- self.q = params.get('loss_gce_q', 0.5)
-
- def forward(self, loss_input_dict):
- predict = loss_input_dict['prediction']
- soft_y = loss_input_dict['ground_truth']
- pix_w = loss_input_dict.get('pixel_weight', None)
- cls_w = loss_input_dict.get('class_weight', None)
-
- if(isinstance(predict, (list, tuple))):
- predict = predict[0]
- if(self.acti_func is not None):
- predict = self.get_activated_prediction(predict, self.acti_func)
- predict = reshape_tensor_to_2D(predict)
- soft_y = reshape_tensor_to_2D(soft_y)
- gce = (1.0 - torch.pow(predict, self.q)) / self.q * soft_y
-
- if(cls_w is not None):
- gce = torch.sum(gce * cls_w, dim = 1)
- else:
- gce = torch.sum(gce, dim = 1)
-
- if(pix_w is not None):
- pix_w = torch.squeeze(reshape_tensor_to_2D(pix_w))
- gce = torch.sum(gce * pix_w) / torch.sum(pix_w)
- else:
- gce = torch.mean(gce)
- return gce
diff --git a/pymic/loss/seg/combined.py b/pymic/loss/seg/combined.py
deleted file mode 100644
index 4e9aad2..0000000
--- a/pymic/loss/seg/combined.py
+++ /dev/null
@@ -1,38 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-
-import torch
-import torch.nn as nn
-from pymic.loss.seg.abstract import AbstractSegLoss
-
-class CombinedLoss(AbstractSegLoss):
- '''
- A combination of a list of loss functions.
- Parameters should be saved in the `params` dictionary.
-
- :param `loss_softmax`: (optional, bool)
- Apply softmax to the prediction of network or not. Default is True.
- :param `loss_type`: (list) A list of loss function name.
- :param `loss_weight`: (list) A list of weights for each loss fucntion.
- :param loss_dict: (dictionary) A dictionary of avaiable loss functions.
-
- '''
- def __init__(self, params, loss_dict):
- super(CombinedLoss, self).__init__(params)
- loss_names = params['loss_type']
- self.loss_weight = params['loss_weight']
- assert (len(loss_names) == len(self.loss_weight))
- self.loss_list = []
- for loss_name in loss_names:
- if(loss_name in loss_dict):
- one_loss = loss_dict[loss_name](params)
- self.loss_list.append(one_loss)
- else:
- raise ValueError("{0:} is not defined, or has not been added to the \
- loss dictionary".format(loss_name))
-
- def forward(self, loss_input_dict):
- loss_value = 0.0
- for i in range(len(self.loss_list)):
- loss_value += self.loss_weight[i]*self.loss_list[i](loss_input_dict)
- return loss_value
diff --git a/pymic/loss/seg/deep_sup.py b/pymic/loss/seg/deep_sup.py
deleted file mode 100644
index 6669486..0000000
--- a/pymic/loss/seg/deep_sup.py
+++ /dev/null
@@ -1,85 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-
-import torch.nn as nn
-import numpy as np
-from torch.nn.functional import interpolate
-from pymic.loss.seg.abstract import AbstractSegLoss
-
-def match_prediction_and_gt_shape(pred, gt, mode = 0):
- pred_shape = list(pred.shape)
- gt_shape = list(gt.shape)
- dim = len(pred_shape) - 2
- shape_match = False
- if(dim == 2):
- if(pred_shape[-1] == gt_shape[-1] and pred_shape[-2] == gt_shape[-2]):
- shape_match = True
- else:
- if(pred_shape[-1] == gt_shape[-1] and pred_shape[-2] == gt_shape[-2]
- and pred_shape[-3] == gt_shape[-3]):
- shape_match = True
- if(shape_match):
- return pred, gt
-
- interp_mode = 'bilinear' if dim == 2 else 'trilinear'
- if(mode == 0):
- pred_new = interpolate(pred, gt_shape[2:], mode = interp_mode)
- gt_new = gt
- elif(mode == 1):
- pred_new = pred
- gt_new = interpolate(gt, pred_shape[2:], mode = interp_mode)
- elif(mode == 2):
- pred_new = pred
- if(dim == 2):
- avg_pool = nn.AdaptiveAvgPool2d(pred_shape[-2:])
- else:
- avg_pool = nn.AdaptiveAvgPool3d(pred_shape[-3:])
- gt_new = avg_pool(gt)
- else:
- raise ValueError("mode shoud be 0, 1 or 2, but {0:} was given".format(mode))
- return pred_new, gt_new
-
-
-class DeepSuperviseLoss(AbstractSegLoss):
- '''
- Combine deep supervision with a basic loss function.
- Arguments should be provided in the `params` dictionary, and it has the
- following fields:
-
- :param `loss_softmax`: (optional, bool)
- Apply softmax to the prediction of network or not. Default is True.
- :param `base_loss`: (nn.Module) The basic function used for each scale.
- :param `deep_supervise_weight`: (list) A list of weight for each deep supervision scale.
- :param `deep_supervise_model`: (int) Mode for deep supervision when the prediction
- has a smaller shape than the ground truth. 0: upsample the prediction to the size
- of the ground truth. 1: downsample the ground truth to the size of the prediction
- via interpolation. 2: downsample the ground truth via adaptive average pooling.
-
- '''
- def __init__(self, params):
- super(DeepSuperviseLoss, self).__init__(params)
- self.base_loss = params['base_loss']
- self.deep_sup_weight = params.get('deep_supervise_weight', None)
- self.deep_sup_mode = params.get('deep_supervise_mode', 0)
-
- def forward(self, loss_input_dict):
- pred = loss_input_dict['prediction']
- gt = loss_input_dict['ground_truth']
- if(not isinstance(pred, (list,tuple))):
- raise ValueError("""For deep supervision, the prediction should
- be a list or a tuple""")
- pred_num = len(pred)
- if(self.deep_sup_weight is None):
- self.deep_sup_weight = [1.0 / pow(2, i) for i in range(pred_num)]
- else:
- assert(pred_num == len(self.deep_sup_weight))
- loss_sum, weight_sum = 0.0, 0.0
- for i in range(pred_num):
- pred_i, gt_i = match_prediction_and_gt_shape(pred[i], gt, self.deep_sup_mode)
- loss_input_dict['prediction'] = pred_i
- loss_input_dict['ground_truth'] = gt_i
- temp_loss = self.base_loss(loss_input_dict)
- loss_sum += temp_loss * self.deep_sup_weight[i]
- weight_sum += self.deep_sup_weight[i]
- loss = loss_sum/weight_sum
- return loss
\ No newline at end of file
diff --git a/pymic/loss/seg/dice.py b/pymic/loss/seg/dice.py
deleted file mode 100644
index c423c2c..0000000
--- a/pymic/loss/seg/dice.py
+++ /dev/null
@@ -1,164 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-
-import torch
-import torch.nn as nn
-from pymic.loss.seg.abstract import AbstractSegLoss
-from pymic.loss.seg.util import reshape_tensor_to_2D, get_classwise_dice
-
-class DiceLoss(AbstractSegLoss):
- '''
- Dice loss for segmentation tasks.
- The parameters should be written in the `params` dictionary, and it has the
- following fields:
-
- :param `loss_softmax`: (bool) Apply softmax to the prediction of network or not.
- '''
- def __init__(self, params = None):
- super(DiceLoss, self).__init__(params)
-
- def forward(self, loss_input_dict):
- predict = loss_input_dict['prediction']
- soft_y = loss_input_dict['ground_truth']
- pix_w = loss_input_dict.get('pixel_weight', None)
- cls_w = loss_input_dict.get('class_weight', None)
-
- if(isinstance(predict, (list, tuple))):
- predict = predict[0]
- if(self.acti_func is not None):
- predict = self.get_activated_prediction(predict, self.acti_func)
- predict = reshape_tensor_to_2D(predict)
- soft_y = reshape_tensor_to_2D(soft_y)
- if(pix_w is not None):
- pix_w = reshape_tensor_to_2D(pix_w)
- dice_loss = 1.0 - get_classwise_dice(predict, soft_y, pix_w)
- if(cls_w is not None):
- weighted_loss = dice_loss * cls_w
- avg_loss = weighted_loss.sum() / cls_w.sum()
- else:
- avg_loss = dice_loss.mean()
- return avg_loss
-
-class BinaryDiceLoss(AbstractSegLoss):
- '''
- Fuse all the foreground classes together and calculate the Dice value.
- '''
- def __init__(self, params = None):
- super(BinaryDiceLoss, self).__init__(params)
-
- def forward(self, loss_input_dict):
- predict = loss_input_dict['prediction']
- soft_y = loss_input_dict['ground_truth']
-
- if(isinstance(predict, (list, tuple))):
- predict = predict[0]
- if(self.acti_func is not None):
- predict = self.get_activated_prediction(predict, self.acti_func)
- predict = 1.0 - predict[:, :1, :, :, :]
- soft_y = 1.0 - soft_y[:, :1, :, :, :]
- predict = reshape_tensor_to_2D(predict)
- soft_y = reshape_tensor_to_2D(soft_y)
- dice_score = get_classwise_dice(predict, soft_y)
- dice_loss = 1.0 - dice_score.mean()
- return dice_loss
-
-class GroupDiceLoss(AbstractSegLoss):
- '''
- Fuse all the foreground classes together and calculate the Dice value.
- '''
- def __init__(self, params = None):
- super(GroupDiceLoss, self).__init__(params)
- self.group = 2
-
- def forward(self, loss_input_dict):
- predict = loss_input_dict['prediction']
- soft_y = loss_input_dict['ground_truth']
-
- if(isinstance(predict, (list, tuple))):
- predict = predict[0]
- if(self.acti_func is not None):
- predict = self.get_activated_prediction(predict, self.acti_func)
- predict = reshape_tensor_to_2D(predict)
- soft_y = reshape_tensor_to_2D(soft_y)
- num_class = list(predict.size())[1]
- cls_per_group = (num_class - 1) // self.group
- loss_all = 0.0
- for g in range(self.group):
- c0 = 1 + g*cls_per_group
- c1 = min(num_class, c0 + cls_per_group)
- pred_g = torch.sum(predict[:, c0:c1], dim = 1, keepdim = True)
- y_g = torch.sum( soft_y[:, c0:c1], dim = 1, keepdim = True)
- loss_all += 1.0 - get_classwise_dice(pred_g, y_g)[0]
- avg_loss = loss_all / self.group
- return avg_loss
-
-class FocalDiceLoss(AbstractSegLoss):
- """
- Focal Dice according to the following paper:
-
- * Pei Wang and Albert C. S. Chung, Focal Dice Loss and Image Dilation for
- Brain Tumor Segmentation, 2018.
-
- The parameters should be written in the `params` dictionary, and it has the
- following fields:
-
- :param `loss_softmax`: (bool) Apply softmax to the prediction of network or not.
- :param `FocalDiceLoss_beta`: (float) The hyper-parameter to set (>=1.0).
- """
- def __init__(self, params = None):
- super(FocalDiceLoss, self).__init__(params)
- self.beta = params['FocalDiceLoss_beta'.lower()] #beta should be >=1.0
-
- def forward(self, loss_input_dict):
- predict = loss_input_dict['prediction']
- soft_y = loss_input_dict['ground_truth']
-
- if(isinstance(predict, (list, tuple))):
- predict = predict[0]
- if(self.acti_func is not None):
- predict = self.get_activated_prediction(predict, self.acti_func)
- predict = reshape_tensor_to_2D(predict)
- soft_y = reshape_tensor_to_2D(soft_y)
-
- dice_score = get_classwise_dice(predict, soft_y)
- dice_score = torch.pow(dice_score, 1.0 / self.beta)
- dice_loss = 1.0 - dice_score.mean()
- return dice_loss
-
-class NoiseRobustDiceLoss(AbstractSegLoss):
- """
- Noise-robust Dice loss according to the following paper.
-
- * G. Wang et al. A Noise-Robust Framework for Automatic Segmentation of COVID-19
- Pneumonia Lesions From CT Images,
- `IEEE TMI `_, 2020.
-
- The parameters should be written in the `params` dictionary, and it has the
- following fields:
-
- :param `loss_softmax`: (bool) Apply softmax to the prediction of network or not.
- :param `NoiseRobustDiceLoss_gamma`: (float) The hyper-parameter gammar to set (1, 2).
- """
- def __init__(self, params):
- super(NoiseRobustDiceLoss, self).__init__(params)
- self.gamma = params['NoiseRobustDiceLoss_gamma'.lower()]
-
- def forward(self, loss_input_dict):
- predict = loss_input_dict['prediction']
- soft_y = loss_input_dict['ground_truth']
-
- if(isinstance(predict, (list, tuple))):
- predict = predict[0]
- if(self.acti_func is not None):
- predict = self.get_activated_prediction(predict, self.acti_func)
- predict = reshape_tensor_to_2D(predict)
- soft_y = reshape_tensor_to_2D(soft_y)
-
- numerator = torch.abs(predict - soft_y)
- numerator = torch.pow(numerator, self.gamma)
- denominator = predict + soft_y
- numer_sum = torch.sum(numerator, dim = 0)
- denom_sum = torch.sum(denominator, dim = 0)
- loss_vector = numer_sum / (denom_sum + 1e-5)
- loss = torch.mean(loss_vector)
- return loss
diff --git a/pymic/loss/seg/exp_log.py b/pymic/loss/seg/exp_log.py
deleted file mode 100644
index 8c0d494..0000000
--- a/pymic/loss/seg/exp_log.py
+++ /dev/null
@@ -1,56 +0,0 @@
-
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-
-import torch
-import torch.nn as nn
-from pymic.loss.seg.abstract import AbstractSegLoss
-from pymic.loss.seg.util import reshape_tensor_to_2D, get_classwise_dice
-
-class ExpLogLoss(AbstractSegLoss):
- """
- The exponential logarithmic loss in this paper:
-
- * K. Wong et al.: 3D Segmentation with Exponential Logarithmic Loss for Highly
- Unbalanced Object Sizes. `MICCAI 2018. `_
-
- The arguments should be written in the `params` dictionary, and it has the
- following fields:
-
- :param `loss_softmax`: (bool) Apply softmax to the prediction of network or not.
- :param `ExpLogLoss_w_dice`: (float) Weight of ExpLog Dice loss in the range of [0, 1].
- :param `ExpLogLoss_gamma`: (float) Hyper-parameter gamma.
- """
- def __init__(self, params):
- super(ExpLogLoss, self).__init__(params)
- self.w_dice = params['ExpLogLoss_w_dice'.lower()]
- self.gamma = params['ExpLogLoss_gamma'.lower()]
-
- def forward(self, loss_input_dict):
- predict = loss_input_dict['prediction']
- soft_y = loss_input_dict['ground_truth']
-
- if(isinstance(predict, (list, tuple))):
- predict = predict[0]
- if(self.acti_func is not None):
- predict = self.get_activated_prediction(predict, self.acti_func)
- predict = reshape_tensor_to_2D(predict)
- soft_y = reshape_tensor_to_2D(soft_y)
-
- dice_score = get_classwise_dice(predict, soft_y)
- dice_score = 0.005 + dice_score * 0.99
- exp_dice = -torch.log(dice_score)
- exp_dice = torch.pow(exp_dice, self.gamma)
- exp_dice = torch.mean(exp_dice)
-
- predict= 0.005 + predict * 0.99
- wc = torch.mean(soft_y, dim = 0)
- wc = 1.0 / (wc + 0.1)
- wc = torch.pow(wc, 0.5)
- ce = - torch.log(predict)
- exp_ce = wc * torch.pow(ce, self.gamma)
- exp_ce = torch.sum(soft_y * exp_ce, dim = 1)
- exp_ce = torch.mean(exp_ce)
-
- loss = exp_dice * self.w_dice + exp_ce * (1.0 - self.w_dice)
- return loss
\ No newline at end of file
diff --git a/pymic/loss/seg/gatedcrf.py b/pymic/loss/seg/gatedcrf.py
deleted file mode 100644
index 46e17e0..0000000
--- a/pymic/loss/seg/gatedcrf.py
+++ /dev/null
@@ -1,184 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-The code is adapted from the original implementation at `Github.
-`_
-"""
-import torch
-import torch.nn.functional as F
-
-class GatedCRFLoss(torch.nn.Module):
- """
- Gated CRF Loss for Weakly Supervised Semantic Image Segmentation.
- This loss function promotes consistent label assignment guided by input features, such as RGBXY.
-
- * Reference: Anton Obukhov, Stamatios Georgoulis, Dengxin Dai and Luc Van Gool:
- Gated CRF Loss for Weakly Supervised Semantic Image Segmentation. `CoRR
- `_ 2019.
- """
- def forward(
- self, y_hat_softmax, kernels_desc, kernels_radius, sample, height_input, width_input,
- mask_src=None, mask_dst=None, compatibility=None, custom_modality_downsamplers=None, out_kernels_vis=False
- ):
- """
- Performs the forward pass of the loss.
-
- :param y_hat_softmax: A tensor of predicted per-pixel class probabilities of size NxCxHxW
- :param kernels_desc: A list of dictionaries, each describing one Gaussian kernel composition from modalities.
- The final kernel is a weighted sum of individual kernels. Following example is a composition of
- RGBXY and XY kernels:
- kernels_desc: [{'weight': 0.9,'xy': 6,'rgb': 0.1},{'weight': 0.1,'xy': 6}]
-
- :param kernels_radius: Defines size of bounding box region around each pixel in which the kernel is constructed.
- :param sample: A dictionary with modalities (except 'xy') used in kernels_desc parameter. Each of the provided
- modalities is allowed to be larger than the shape of y_hat_softmax, in such case downsampling will be
- invoked. Default downsampling method is area resize; this can be overriden by setting.
- custom_modality_downsamplers parameter.
- :param width_input, height_input: Dimensions of the full scale resolution of modalities
- :param mask_src: (optional) Source mask.
- :param mask_dst: (optional) Destination mask.
- :param compatibility: (optional) Classes compatibility matrix, defaults to Potts model.
- :param custom_modality_downsamplers: A dictionary of modality downsampling functions.
- :param out_kernels_vis: Whether to return a tensor with kernels visualized with some step.
- :return: Loss function value.
- """
- assert y_hat_softmax.dim() == 4, 'Prediction must be a NCHW batch'
- N, C, height_pred, width_pred = y_hat_softmax.shape
- device = y_hat_softmax.device
-
- assert width_input % width_pred == 0 and height_input % height_pred == 0 and \
- width_input * height_pred == height_input * width_pred, \
- f'[{width_input}x{height_input}] !~= [{width_pred}x{height_pred}]'
-
- kernels = self._create_kernels(
- kernels_desc, kernels_radius, sample, N, height_pred, width_pred, device, custom_modality_downsamplers
- )
-
- denom = N * height_pred * width_pred
-
- def resize_fix_mask(mask, name):
- assert mask.dim() == 4 and mask.shape[:2] == (N, 1) and mask.dtype == torch.float32, \
- f'{name} mask must be a NCHW batch with C=1 and dtype float32'
- if mask.shape[2:] != (height_pred, width_pred):
- mask = GatedCRFLoss._downsample(
- mask, 'mask', height_pred, width_pred, custom_modality_downsamplers
- )
- mask[mask != mask] = 0.0 # handle NaN
- mask[mask < 1.0] = 0.0 # handle edges of mask after interpolation
- return mask
-
- if mask_src is not None:
- mask_src = resize_fix_mask(mask_src, 'Source')
- denom = mask_src.sum().clamp(min=1)
- mask_src = self._unfold(mask_src, kernels_radius)
- kernels = kernels * mask_src
-
- if mask_dst is not None:
- mask_dst = resize_fix_mask(mask_dst, 'Destination')
- denom = mask_dst.sum().clamp(min=1)
- mask_dst = mask_dst.view(N, 1, 1, 1, height_pred, width_pred)
- kernels = kernels * mask_dst
-
- y_hat_unfolded = self._unfold(y_hat_softmax, kernels_radius)
-
- product_kernel_x_y_hat = (kernels * y_hat_unfolded) \
- .view(N, C, (kernels_radius * 2 + 1) ** 2, height_pred, width_pred) \
- .sum(dim=2, keepdim=False)
-
- if compatibility is None:
- # Using shortcut for Pott's class compatibility model
- loss = -(product_kernel_x_y_hat * y_hat_softmax).sum()
- loss = kernels.sum() + loss # comment out to save computation, total loss may go below 0
- else:
- assert compatibility.shape == (C, C), f'Compatibility matrix expected shape [{C}x{C}]'
- assert (compatibility < 0).int().sum() == 0, 'Compatibility matrix must not have negative values'
- assert compatibility.diag.sum() == 0, 'Compatibility matrix diagonal must be 0'
- compat = (C-1) * F.normalize(compatibility.float().to(device), p=1, dim=1)
- y_hat_CxNHW = y_hat_softmax.permute(1, 0, 2, 3).contiguous().view(C, -1)
- product_kernel_x_y_hat_NHWxC = product_kernel_x_y_hat.permute(0, 2, 3, 1).contiguous().view(-1, C)
- product_CxC = torch.mm(y_hat_CxNHW, product_kernel_x_y_hat_NHWxC)
- loss = (compat * product_CxC).sum()
-
- out = {
- 'loss': loss / denom,
- }
-
- if out_kernels_vis:
- out['kernels_vis'] = self._visualize_kernels(
- kernels, kernels_radius, height_input, width_input, height_pred, width_pred
- )
-
- return out
-
- @staticmethod
- def _downsample(img, modality, height_dst, width_dst, custom_modality_downsamplers):
- if custom_modality_downsamplers is not None and modality in custom_modality_downsamplers:
- f_down = custom_modality_downsamplers[modality]
- else:
- f_down = F.adaptive_avg_pool2d
- return f_down(img, (height_dst, width_dst))
-
- @staticmethod
- def _create_kernels(
- kernels_desc, kernels_radius, sample, N, height_pred, width_pred, device, custom_modality_downsamplers
- ):
- kernels = None
- for i, desc in enumerate(kernels_desc):
- weight = desc['weight']
- features = []
- for modality, sigma in desc.items():
- if modality == 'weight':
- continue
- if modality == 'xy':
- feature = GatedCRFLoss._get_mesh(N, height_pred, width_pred, device)
- else:
- assert modality in sample, \
- f'Modality {modality} is listed in {i}-th kernel descriptor, but not present in the sample'
- feature = sample[modality]
- feature = GatedCRFLoss._downsample(
- feature, modality, height_pred, width_pred, custom_modality_downsamplers
- )
- feature /= sigma
- features.append(feature)
- features = torch.cat(features, dim=1)
- kernel = weight * GatedCRFLoss._create_kernels_from_features(features, kernels_radius)
- kernels = kernel if kernels is None else kernel + kernels
- return kernels
-
- @staticmethod
- def _create_kernels_from_features(features, radius):
- assert features.dim() == 4, 'Features must be a NCHW batch'
- N, C, H, W = features.shape
- kernels = GatedCRFLoss._unfold(features, radius)
- kernels = kernels - kernels[:, :, radius, radius, :, :].view(N, C, 1, 1, H, W)
- kernels = (-0.5 * kernels ** 2).sum(dim=1, keepdim=True).exp()
- kernels[:, :, radius, radius, :, :] = 0
- return kernels
-
- @staticmethod
- def _get_mesh(N, H, W, device):
- return torch.cat((
- torch.arange(0, W, 1, dtype=torch.float32, device=device).view(1, 1, 1, W).repeat(N, 1, H, 1),
- torch.arange(0, H, 1, dtype=torch.float32, device=device).view(1, 1, H, 1).repeat(N, 1, 1, W)
- ), 1)
-
- @staticmethod
- def _unfold(img, radius):
- assert img.dim() == 4, 'Unfolding requires NCHW batch'
- N, C, H, W = img.shape
- diameter = 2 * radius + 1
- return F.unfold(img, diameter, 1, radius).view(N, C, diameter, diameter, H, W)
-
- @staticmethod
- def _visualize_kernels(kernels, radius, height_input, width_input, height_pred, width_pred):
- diameter = 2 * radius + 1
- vis = kernels[:, :, :, :, radius::diameter, radius::diameter]
- vis_nh, vis_nw = vis.shape[-2:]
- vis = vis.permute(0, 1, 4, 2, 5, 3).contiguous().view(kernels.shape[0], 1, diameter * vis_nh, diameter * vis_nw)
- if vis.shape[2] > height_pred:
- vis = vis[:, :, :height_pred, :]
- if vis.shape[3] > width_pred:
- vis = vis[:, :, :, :width_pred]
- if vis.shape[2:] != (height_pred, width_pred):
- vis = F.pad(vis, [0, width_pred-vis.shape[3], 0, height_pred-vis.shape[2]])
- vis = F.interpolate(vis, (height_input, width_input), mode='nearest')
- return vis
diff --git a/pymic/loss/seg/mse.py b/pymic/loss/seg/mse.py
deleted file mode 100644
index eb53af4..0000000
--- a/pymic/loss/seg/mse.py
+++ /dev/null
@@ -1,54 +0,0 @@
-import torch
-import torch.nn as nn
-from pymic.loss.seg.abstract import AbstractSegLoss
-
-class MSELoss(AbstractSegLoss):
- """
- Mean Sequare Loss for segmentation tasks.
- The parameters should be written in the `params` dictionary, and it has the
- following fields:
-
- :param `loss_softmax`: (bool) Apply softmax to the prediction of network or not.
- """
- def __init__(self, params = None):
- super(MSELoss, self).__init__(params)
-
- def forward(self, loss_input_dict):
- predict = loss_input_dict['prediction']
- soft_y = loss_input_dict['ground_truth']
-
- if(isinstance(predict, (list, tuple))):
- predict = predict[0]
- if(self.acti_func is not None):
- predict = self.get_activated_prediction(predict, self.acti_func)
- mse = torch.square(predict - soft_y)
- mse = torch.mean(mse)
- return mse
-
-
-class MAELoss(AbstractSegLoss):
- """
- Mean Absolute Loss for segmentation tasks.
- The arguments should be written in the `params` dictionary, and it has the
- following fields:
-
- :param `loss_softmax`: (bool) Apply softmax to the prediction of network or not.
- """
- def __init__(self, params = None):
- super(MAELoss, self).__init__(params)
-
- def forward(self, loss_input_dict):
- predict = loss_input_dict['prediction']
- soft_y = loss_input_dict['ground_truth']
- weight = loss_input_dict.get('pixel_weight', None)
-
- if(isinstance(predict, (list, tuple))):
- predict = predict[0]
- if(self.acti_func is not None):
- predict = self.get_activated_prediction(predict, self.acti_func)
- mae = torch.abs(predict - soft_y)
- if(weight is None):
- mae = torch.mean(mae)
- else:
- mae = torch.sum(mae * weight) / weight.sum()
- return mae
diff --git a/pymic/loss/seg/mumford_shah.py b/pymic/loss/seg/mumford_shah.py
deleted file mode 100644
index db9368a..0000000
--- a/pymic/loss/seg/mumford_shah.py
+++ /dev/null
@@ -1,96 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-
-import torch
-import torch.nn as nn
-from pymic.loss.seg.abstract import AbstractSegLoss
-
-class MumfordShahLoss(AbstractSegLoss):
- """
- Implementation of Mumford Shah Loss for weakly supervised learning.
-
- * Reference: Boah Kim and Jong Chul Ye: Mumford–Shah Loss Functional
- for Image Segmentation With Deep Learning. IEEE TIP, 2019.
-
- The oringial implementation is availabel at `Github.
- `_
- Currently only 2D version is supported.
-
- The parameters should be written in the `params` dictionary, and it has the
- following fields:
-
- :param `loss_softmax`: (bool) Apply softmax to the prediction of network or not.
- :param `MumfordShahLoss_penalty`: (optional, str) `l1` or `l2`. Default is `l1`.
- :param `MumfordShahLoss_lambda`: (optional, float) Hyper-parameter lambda, default is 1.0.
- """
- def __init__(self, params = None):
- super(MumfordShahLoss, self).__init__()
- if(params is None):
- params = {}
- self.penalty = params.get('MumfordShahLoss_penalty', "l1")
- self.grad_w = params.get('MumfordShahLoss_lambda', 1.0)
-
- def get_levelset_loss(self, output, target):
- """
- Get the level set loss value.
-
- :param `output`: (tensor) softmax output of a network.
- :param `target`: (tensor) the input image.
- :return: the level set loss.
- """
- outshape = output.shape
- tarshape = target.shape
- loss = 0.0
- for ich in range(tarshape[1]):
- target_ = torch.unsqueeze(target[:,ich], 1)
- target_ = target_.expand(tarshape[0], outshape[1], tarshape[2], tarshape[3])
- pcentroid = torch.sum(target_ * output, (2,3))/torch.sum(output, (2,3))
- pcentroid = pcentroid.view(tarshape[0], outshape[1], 1, 1)
- plevel = target_ - pcentroid.expand(tarshape[0], outshape[1], tarshape[2], tarshape[3])
- pLoss = plevel * plevel * output
- loss += torch.sum(pLoss)
- return loss
-
- def get_gradient_loss(self, pred, penalty = "l2"):
- dH = torch.abs(pred[:, :, 1:, :] - pred[:, :, :-1, :])
- dW = torch.abs(pred[:, :, :, 1:] - pred[:, :, :, :-1])
- if penalty == "l2":
- dH = dH * dH
- dW = dW * dW
- loss = torch.sum(dH) + torch.sum(dW)
- return loss
-
- def forward(self, loss_input_dict):
- """
- Forward pass for calculating the loss.
- The arguments should be written in the `loss_input_dict` dictionary,
- and it has the following fields:
-
- :param `prediction`: (tensor) Prediction of a network, with the
- shape of [N, C, D, H, W] or [N, C, H, W].
- :param `image`: (tensor) Image, with the
- shape of [N, C, D, H, W] or [N, C, H, W].
-
- :return: Loss function value.
- """
- predict = loss_input_dict['prediction']
- image = loss_input_dict['image']
- if(isinstance(predict, (list, tuple))):
- predict = predict[0]
- if(self.acti_func is not None):
- predict = self.get_activated_prediction(predict, self.acti_func)
-
- pred_shape = list(predict.shape)
- if(len(pred_shape) == 5):
- [N, C, D, H, W] = pred_shape
- new_shape = [N*D, C, H, W]
- predict = torch.transpose(predict, 1, 2)
- predict = torch.reshape(predict, new_shape)
- [N, C, D, H, W] = list(image.shape)
- new_shape = [N*D, C, H, W]
- image = torch.transpose(image, 1, 2)
- image = torch.reshape(image, new_shape)
- loss0 = self.get_levelset_loss(predict, image)
- loss1 = self.get_gradient_loss(predict, self.penalty)
- loss = loss0 + self.grad_w * loss1
- return loss/torch.numel(predict)
diff --git a/pymic/loss/seg/slsr.py b/pymic/loss/seg/slsr.py
deleted file mode 100644
index 92adea7..0000000
--- a/pymic/loss/seg/slsr.py
+++ /dev/null
@@ -1,58 +0,0 @@
-# -*- coding: utf-8 -*-
-
-from __future__ import print_function, division
-
-import torch
-import torch.nn as nn
-from pymic.loss.seg.abstract import AbstractSegLoss
-from pymic.loss.seg.util import reshape_tensor_to_2D
-
-class SLSRLoss(AbstractSegLoss):
- """
- Spatial Label Smoothing Regularization (SLSR) loss for learning from
- noisy annotatins. This loss requires pixel weighting, please make sure
- that a `pixel_weight` field is provided for the csv file of the training images.
-
- The pixel wight here is actually the confidence mask, i.e., if the value is one,
- it means the label of corresponding pixel is noisy and should be smoothed.
-
- * Reference: Minqing Zhang, Jiantao Gao et al.: Characterizing Label Errors: Confident Learning for Noisy-Labeled Image
- Segmentation, `MICCAI 2020. `_
-
- The arguments should be written in the `params` dictionary, and it has the
- following fields:
-
- :param `loss_softmax`: (bool) Apply softmax to the prediction of network or not.
- :param `slsrloss_epsilon`: (optional, float) Hyper-parameter epsilon. Default is 0.25.
- """
- def __init__(self, params = None):
- super(SLSRLoss, self).__init__(params)
- if(params is None):
- params = {}
- self.epsilon = params.get('slsrloss_epsilon', 0.25)
-
- def forward(self, loss_input_dict):
- predict = loss_input_dict['prediction']
- soft_y = loss_input_dict['ground_truth']
- pix_w = loss_input_dict.get('pixel_weight', None)
-
- if(isinstance(predict, (list, tuple))):
- predict = predict[0]
- if(self.acti_func is not None):
- predict = self.get_activated_prediction(predict, self.acti_func)
- predict = reshape_tensor_to_2D(predict)
- soft_y = reshape_tensor_to_2D(soft_y)
- if(pix_w is not None):
- pix_w = reshape_tensor_to_2D(pix_w > 0).float()
- # smooth labels for pixels in the unconfident mask
- smooth_y = (soft_y - 0.5) * (0.5 - self.epsilon) / 0.5 + 0.5
- smooth_y = pix_w * smooth_y + (1 - pix_w) * soft_y
- else:
- smooth_y = soft_y
-
- # for numeric stability
- predict = predict * 0.999 + 5e-4
- ce = - smooth_y* torch.log(predict)
- ce = torch.sum(ce, dim = 1) # shape is [N]
- ce = torch.mean(ce)
- return ce
diff --git a/pymic/loss/seg/ssl.py b/pymic/loss/seg/ssl.py
deleted file mode 100644
index 3a7430a..0000000
--- a/pymic/loss/seg/ssl.py
+++ /dev/null
@@ -1,87 +0,0 @@
-
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-
-import torch
-import torch.nn as nn
-import numpy as np
-from pymic.loss.seg.util import reshape_tensor_to_2D
-from pymic.loss.seg.abstract import AbstractSegLoss
-
-class EntropyLoss(AbstractSegLoss):
- """
- Entropy Minimization for segmentation tasks.
- The parameters should be written in the `params` dictionary, and it has the
- following fields:
-
- :param `loss_softmax`: (bool) Apply softmax to the prediction of network or not.
- """
- def __init__(self, params = None):
- super(EntropyLoss, self).__init__(params)
-
- def forward(self, loss_input_dict):
- """
- Forward pass for calculating the loss.
- The arguments should be written in the `loss_input_dict` dictionary,
- and it has the following fields:
-
- :param `prediction`: (tensor) Prediction of a network, with the
- shape of [N, C, D, H, W] or [N, C, H, W].
-
- :return: Loss function value.
- """
- predict = loss_input_dict['prediction']
-
- if(isinstance(predict, (list, tuple))):
- predict = predict[0]
- if(self.acti_func is not None):
- predict = self.get_activated_prediction(predict, self.acti_func)
-
- # for numeric stability
- predict = predict * 0.999 + 5e-4
- C = list(predict.shape)[1]
- entropy = torch.sum(-predict*torch.log(predict), dim=1) / np.log(C)
- avg_ent = torch.mean(entropy)
- return avg_ent
-
-class TotalVariationLoss(AbstractSegLoss):
- """
- Total Variation Loss for segmentation tasks.
- The parameters should be written in the `params` dictionary, and it has the
- following fields:
-
- :param `loss_softmax`: (bool) Apply softmax to the prediction of network or not.
- """
- def __init__(self, params = None):
- super(TotalVariationLoss, self).__init__(params)
-
- def forward(self, loss_input_dict):
- """
- Forward pass for calculating the loss.
- The arguments should be written in the `loss_input_dict` dictionary,
- and it has the following fields:
-
- :param `prediction`: (tensor) Prediction of a network, with the
- shape of [N, C, D, H, W] or [N, C, H, W].
-
- :return: Loss function value.
- """
- predict = loss_input_dict['prediction']
-
- if(isinstance(predict, (list, tuple))):
- predict = predict[0]
- if(self.acti_func is not None):
- predict = self.get_activated_prediction(predict, self.acti_func)
-
- # for numeric stability
- predict = predict * 0.999 + 5e-4
- dim = list(predict.shape)[2:]
- if(dim == 2):
- pred_min = -1 * nn.functional.max_pool2d(-1*predict, (3, 3), 1, 1)
- pred_max = nn.functional.max_pool2d(pred_min, (3, 3), 1, 1)
- else:
- pred_min = -1 * nn.functional.max_pool3d(-1*predict, (3, 3, 3), 1, 1)
- pred_max = nn.functional.max_pool3d(pred_min, (3, 3, 3), 1, 1)
- contour = torch.relu(pred_max - pred_min)
- length = torch.mean(contour)
- return length
\ No newline at end of file
diff --git a/pymic/loss/seg/util.py b/pymic/loss/seg/util.py
deleted file mode 100644
index 4ca41d2..0000000
--- a/pymic/loss/seg/util.py
+++ /dev/null
@@ -1,97 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-
-import torch
-import torch.nn as nn
-import numpy as np
-
-def get_soft_label(input_tensor, num_class, data_type = 'float'):
- """
- Convert a label tensor to one-hot label for segmentation tasks.
-
- :param `input_tensor`: (tensor) Tensor with shae [B, 1, D, H, W] or [B, 1, H, W].
- :param `num_class`: (int) The class number.
- :param `data_type`: (optional, str) Type of data, `float` (default) or `double`.
-
- :return: A tensor with shape [B, num_class, D, H, W] or [B, num_class, H, W]
- """
-
- shape = input_tensor.shape
- if len(shape) == 5:
- output_tensor = torch.nn.functional.one_hot(input_tensor[:, 0], num_classes = num_class).permute(0, 4, 1, 2, 3)
- elif len(shape) == 4:
- output_tensor = torch.nn.functional.one_hot(input_tensor[:, 0], num_classes = num_class).permute(0, 3, 1, 2)
- else:
- raise ValueError("dimention of data can only be 4 or 5: {0:}".format(len(shape)))
-
- if(data_type == 'float'):
- output_tensor = output_tensor.float()
- elif(data_type == 'double'):
- output_tensor = output_tensor.double()
- else:
- raise ValueError("data type can only be float and double: {0:}".format(data_type))
-
- return output_tensor
-
-def reshape_tensor_to_2D(x):
- """
- Reshape input tensor of shape [N, C, D, H, W] or [N, C, H, W] to [voxel_n, C]
- """
- tensor_dim = len(x.size())
- num_class = list(x.size())[1]
- if(tensor_dim == 5):
- x_perm = x.permute(0, 2, 3, 4, 1)
- elif(tensor_dim == 4):
- x_perm = x.permute(0, 2, 3, 1)
- else:
- raise ValueError("{0:}D tensor not supported".format(tensor_dim))
-
- y = torch.reshape(x_perm, (-1, num_class))
- return y
-
-def reshape_prediction_and_ground_truth(predict, soft_y):
- """
- Reshape input variables two 2D.
-
- :param predict: (tensor) A tensor of shape [N, C, D, H, W] or [N, C, H, W].
- :param soft_y: (tensor) A tensor of shape [N, C, D, H, W] or [N, C, H, W].
-
- :return: Two output tensors with shape [voxel_n, C] that correspond to the two inputs.
- """
- tensor_dim = len(predict.size())
- num_class = list(predict.size())[1]
- if(tensor_dim == 5):
- soft_y = soft_y.permute(0, 2, 3, 4, 1)
- predict = predict.permute(0, 2, 3, 4, 1)
- elif(tensor_dim == 4):
- soft_y = soft_y.permute(0, 2, 3, 1)
- predict = predict.permute(0, 2, 3, 1)
- else:
- raise ValueError("{0:}D tensor not supported".format(tensor_dim))
-
- predict = torch.reshape(predict, (-1, num_class))
- soft_y = torch.reshape(soft_y, (-1, num_class))
-
- return predict, soft_y
-
-def get_classwise_dice(predict, soft_y, pix_w = None):
- """
- Get dice scores for each class in predict (after softmax) and soft_y.
-
- :param predict: (tensor) Prediction of a segmentation network after softmax.
- :param soft_y: (tensor) The one-hot segmentation ground truth.
- :param pix_w: (optional, tensor) The pixel weight map. Default is None.
-
- :return: Dice score for each class.
- """
-
- if(pix_w is None):
- y_vol = torch.sum(soft_y, dim = 0)
- p_vol = torch.sum(predict, dim = 0)
- intersect = torch.sum(soft_y * predict, dim = 0)
- else:
- y_vol = torch.sum(soft_y * pix_w, dim = 0)
- p_vol = torch.sum(predict * pix_w, dim = 0)
- intersect = torch.sum(soft_y * predict * pix_w, dim = 0)
- dice_score = (2.0 * intersect + 1e-5)/ (y_vol + p_vol + 1e-5)
- return dice_score
diff --git a/pymic/net/__init__.py b/pymic/net/__init__.py
deleted file mode 100644
index e69de29..0000000
diff --git a/pymic/net/cls/__init__.py b/pymic/net/cls/__init__.py
deleted file mode 100644
index 72b8078..0000000
--- a/pymic/net/cls/__init__.py
+++ /dev/null
@@ -1,2 +0,0 @@
-from __future__ import absolute_import
-from . import *
\ No newline at end of file
diff --git a/pymic/net/cls/torch_pretrained_net.py b/pymic/net/cls/torch_pretrained_net.py
deleted file mode 100644
index 9d05c28..0000000
--- a/pymic/net/cls/torch_pretrained_net.py
+++ /dev/null
@@ -1,244 +0,0 @@
-# pretrained models from pytorch: https://pytorch.org/vision/0.8/models.html
-from __future__ import print_function, division
-
-import itertools
-import torch.nn as nn
-import torchvision.models as models
-
-# buildin_net_dict={
-# 'resnet18': models.resnet18,
-# 'alexnet': models.alexnet,
-# 'vgg16': models.vgg16,
-# 'squeezenet': models.squeezenet1_0,
-# 'densenet': models.densenet161,
-# 'inception':models.inception_v3,
-# 'googlenet':models.googlenet,
-# 'shufflenet': models.shufflenet_v2_x1_0,
-# 'mobilenet':models.mobilenet,
-# 'resnext50':models.resnext50_32x4d,
-# 'wide_resnet': models.wide_resnet50_2,
-# 'mnasnet': models.mnasnet1_0
-# }
-
-class BuiltInNet(nn.Module):
- """
- Built-in Network in Pytorch for classification.
- Parameters should be set in the `params` dictionary that contains the
- following fields:
-
- :param input_chns: (int) Input channel number, default is 3.
- :param pretrain: (bool) Using pretrained model or not, default is True.
- :param update_mode: (str) The strategy for updating layers: "`all`" means updating
- all the layers, and "`last`" (by default) means updating the last layer,
- as well as the first layer when `input_chns` is not 3.
- """
- def __init__(self, params):
- super(BuiltInNet, self).__init__()
- self.params = params
- self.in_chns = params.get('input_chns', 3)
- self.pretrain = params.get('pretrain', True)
- self.update_mode = params.get('update_mode', "last")
- self.net = None
-
- def forward(self, x):
- return self.net(x)
-
- def get_parameters_to_update(self):
- pass
-
-class ResNet18(BuiltInNet):
- """
- ResNet18 for classification.
- Parameters should be set in the `params` dictionary that contains the
- following fields:
-
- :param input_chns: (int) Input channel number, default is 3.
- :param pretrain: (bool) Using pretrained model or not, default is True.
- :param update_mode: (str) The strategy for updating layers: "`all`" means updating
- all the layers, and "`last`" (by default) means updating the last layer,
- as well as the first layer when `input_chns` is not 3.
- """
- def __init__(self, params):
- super(ResNet18, self).__init__(params)
- weights = 'IMAGENET1K_V1' if self.pretrain else None
- self.net = models.resnet18(weights = weights)
-
- # replace the last layer
- num_ftrs = self.net.fc.in_features
- self.net.fc = nn.Linear(num_ftrs, params['class_num'])
-
- # replace the first layer when in_chns is not 3
- if(self.in_chns != 3):
- self.net.conv1 = nn.Conv2d(self.in_chns, 64, kernel_size=(7, 7),
- stride=(2, 2), padding=(3, 3), bias=False)
-
- def get_parameters_to_update(self):
- if(self.update_mode == "all"):
- return self.net.parameters()
- elif(self.update_mode == "last"):
- params = self.net.fc.parameters()
- if(self.in_chns !=3):
- # combining the two iterables into a single one
- # see: https://dzone.com/articles/python-joining-multiple
- params = itertools.chain()
- for pram in [self.net.fc.parameters(), self.net.conv1.parameters()]:
- params = itertools.chain(params, pram)
- return params
- else:
- raise(ValueError("update_mode can only be 'all' or 'last'."))
-
-class ResNet50(BuiltInNet):
- """
- ResNet18 for classification.
- Parameters should be set in the `params` dictionary that contains the
- following fields:
-
- :param input_chns: (int) Input channel number, default is 3.
- :param pretrain: (bool) Using pretrained model or not, default is True.
- :param update_mode: (str) The strategy for updating layers: "`all`" means updating
- all the layers, and "`last`" (by default) means updating the last layer,
- as well as the first layer when `input_chns` is not 3.
- """
- def __init__(self, params):
- super(ResNet50, self).__init__(params)
- weights = 'IMAGENET1K_V1' if self.pretrain else None
- self.net = models.resnet50(weights = weights)
-
- # replace the last layer
- num_ftrs = self.net.fc.in_features
- self.net.fc = nn.Linear(num_ftrs, params['class_num'])
-
- # replace the first layer when in_chns is not 3
- if(self.in_chns != 3):
- self.net.conv1 = nn.Conv2d(self.in_chns, 64, kernel_size=(7, 7),
- stride=(2, 2), padding=(3, 3), bias=False)
-
- def get_parameters_to_update(self):
- if(self.update_mode == "all"):
- return self.net.parameters()
- elif(self.update_mode == "last"):
- params = self.net.fc.parameters()
- if(self.in_chns !=3):
- # combining the two iterables into a single one
- # see: https://dzone.com/articles/python-joining-multiple
- params = itertools.chain()
- for pram in [self.net.fc.parameters(), self.net.conv1.parameters()]:
- params = itertools.chain(params, pram)
- return params
- else:
- raise(ValueError("update_mode can only be 'all' or 'last'."))
-
-class VGG16(BuiltInNet):
- """
- VGG16 for classification.
- Parameters should be set in the `params` dictionary that contains the
- following fields:
-
- :param input_chns: (int) Input channel number, default is 3.
- :param pretrain: (bool) Using pretrained model or not, default is True.
- :param update_mode: (str) The strategy for updating layers: "`all`" means updating
- all the layers, and "`last`" (by default) means updating the last layer,
- as well as the first layer when `input_chns` is not 3.
- """
- def __init__(self, params):
- super(VGG16, self).__init__(params)
- weights = 'IMAGENET1K_V1' if self.pretrain else None
- self.net = models.vgg16(weights = weights)
-
- # replace the last layer
- num_ftrs = self.net.classifier[-1].in_features
- self.net.classifier[-1] = nn.Linear(num_ftrs, params['class_num'])
-
- # replace the first layer when in_chns is not 3
- if(self.in_chns != 3):
- self.net.features[0] = nn.Conv2d(self.in_chns, 64, kernel_size=(3, 3),
- stride=(1, 1), padding=(1, 1), bias=False)
-
- def get_parameters_to_update(self):
- if(self.update_mode == "all"):
- return self.net.parameters()
- elif(self.update_mode == "last"):
- params = self.net.classifier[-1].parameters()
- if(self.in_chns !=3):
- params = itertools.chain()
- for pram in [self.net.classifier[-1].parameters(), self.net.features[0].parameters()]:
- params = itertools.chain(params, pram)
- return params
- else:
- raise(ValueError("update_mode can only be 'all' or 'last'."))
-
-class MobileNetV2(BuiltInNet):
- """
- MobileNetV2 for classification.
- Parameters should be set in the `params` dictionary that contains the
- following fields:
-
- :param input_chns: (int) Input channel number, default is 3.
- :param pretrain: (bool) Using pretrained model or not, default is True.
- :param update_mode: (str) The strategy for updating layers: "`all`" means updating
- all the layers, and "`last`" (by default) means updating the last layer,
- as well as the first layer when `input_chns` is not 3.
- """
- def __init__(self, params):
- super(MobileNetV2, self).__init__(params)
- weights = 'IMAGENET1K_V1' if self.pretrain else None
- self.net = models.mobilenet_v2(weights = weights)
-
- # replace the last layer
- num_ftrs = self.net.last_channel
- self.net.classifier[-1] = nn.Linear(num_ftrs, params['class_num'])
-
- # replace the first layer when in_chns is not 3
- if(self.in_chns != 3):
- self.net.features[0][0] = nn.Conv2d(self.in_chns, 32, kernel_size=(3, 3),
- stride=(2, 2), padding=(1, 1), bias=False)
-
- def get_parameters_to_update(self):
- if(self.update_mode == "all"):
- return self.net.parameters()
- elif(self.update_mode == "last"):
- params = self.net.classifier[-1].parameters()
- if(self.in_chns !=3):
- params = itertools.chain()
- for pram in [self.net.classifier[-1].parameters(), self.net.features[0][0].parameters()]:
- params = itertools.chain(params, pram)
- return params
- else:
- raise(ValueError("update_mode can only be 'all' or 'last'."))
-
-class ViTB16(BuiltInNet):
- """
- ViTB16 for classification.
- Parameters should be set in the `params` dictionary that contains the
- following fields:
-
- :param input_chns: (int) Input channel number, default is 3.
- :param pretrain: (bool) Using pretrained model or not, default is True.
- :param update_mode: (str) The strategy for updating layers: "`all`" means updating
- all the layers, and "`last`" (by default) means updating the last layer,
- as well as the first layer when `input_chns` is not 3.
- """
- def __init__(self, params):
- super(ViTB16, self).__init__(params)
- weights = 'IMAGENET1K_V1' if self.pretrain else None
- self.net = models.vit_b_16(weights = weights)
-
- # replace the last layer
- num_ftrs = self.net.representation_size
- if(num_ftrs is None):
- num_ftrs = self.net.hidden_dim
- self.net.heads[-1] = nn.Linear(num_ftrs, params['class_num'])
-
- def get_parameters_to_update(self):
- if(self.update_mode == "all"):
- return self.net.parameters()
- elif(self.update_mode == "last"):
- params = self.net.heads[-1].parameters()
- return params
- else:
- raise(ValueError("update_mode can only be 'all' or 'last'."))
-
-if __name__ == "__main__":
- params = {"class_num": 2, "pretrain": False, "input_chns": 3}
- net = ResNet18(params)
- print(net)
\ No newline at end of file
diff --git a/pymic/net/cnn/__init__.py b/pymic/net/cnn/__init__.py
deleted file mode 100644
index 72b8078..0000000
--- a/pymic/net/cnn/__init__.py
+++ /dev/null
@@ -1,2 +0,0 @@
-from __future__ import absolute_import
-from . import *
\ No newline at end of file
diff --git a/pymic/net/cnn/basic_layer.py b/pymic/net/cnn/basic_layer.py
deleted file mode 100644
index eadfb85..0000000
--- a/pymic/net/cnn/basic_layer.py
+++ /dev/null
@@ -1,45 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-
-import logging
-import torch
-import torch.nn as nn
-import numpy as np
-
-def get_conv_class(dim = 2):
- if(dim == 2):
- return nn.Conv2d
- elif(dim == 3):
- return nn.Conv3d
- else:
- raise ValueError("dim should be 2 or 3 in get_conv_class")
-
-def get_transpose_conv_class(dim = 2):
- if(dim == 2):
- return nn.ConvTranspose2d
- elif(dim == 3):
- return nn.ConvTranspose3d
- else:
- raise ValueError("dim should be 2 or 3 in get_transpose_conv_class")
-
-def get_norm_class(dim = 2, norm_type = "batch_norm"):
- if(dim == 2):
- if(norm_type == "batch_norm"):
- return nn.BatchNorm2d
- else:
- return nn.InstanceNorm2d
- elif(dim == 3):
- if(norm_type == "batch_norm"):
- return nn.BatchNorm3d
- else:
- return nn.InstanceNorm3d
- else:
- raise ValueError("dim should be 2 or 3 in get_norm_class")
-
-def get_maxpool_class(dim = 2):
- if(dim == 2):
- return nn.MaxPool2d
- elif(dim == 3):
- return nn.MaxPool3d
- else:
- raise ValueError("dim should be 2 or 3 in get_maxpool_class")
\ No newline at end of file
diff --git a/pymic/net/cnn/coplenet2d.py b/pymic/net/cnn/coplenet2d.py
deleted file mode 100644
index 046dee8..0000000
--- a/pymic/net/cnn/coplenet2d.py
+++ /dev/null
@@ -1,239 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-import torch
-import torch.nn as nn
-
-class ConvLayer(nn.Module):
- """
- A combination of Conv2d, BatchNorm2d and LeakyReLU.
- """
- def __init__(self, in_channels, out_channels, kernel_size = 1):
- super(ConvLayer, self).__init__()
- padding = int((kernel_size - 1) / 2)
- self.conv = nn.Sequential(
- nn.Conv2d(in_channels, out_channels, kernel_size=kernel_size, padding=padding),
- nn.BatchNorm2d(out_channels),
- nn.LeakyReLU()
- )
-
- def forward(self, x):
- return self.conv(x)
-
-class SEBlock(nn.Module):
- """
- A Modified Squeeze-and-Excitation block for spatial attention.
- """
- def __init__(self, in_channels, r):
- super(SEBlock, self).__init__()
-
- redu_chns = int(in_channels / r)
- self.se_layers = nn.Sequential(
- nn.AdaptiveAvgPool2d(1),
- nn.Conv2d(in_channels, redu_chns, kernel_size=1, padding=0),
- nn.LeakyReLU(),
- nn.Conv2d(redu_chns, in_channels, kernel_size=1, padding=0),
- nn.ReLU())
-
- def forward(self, x):
- f = self.se_layers(x)
- return f*x + x
-
-class ASPPBlock(nn.Module):
- """
- ASPP block.
- """
- def __init__(self,in_channels, out_channels_list, kernel_size_list, dilation_list):
- super(ASPPBlock, self).__init__()
- self.conv_num = len(out_channels_list)
- assert(self.conv_num == 4)
- assert(self.conv_num == len(kernel_size_list) and self.conv_num == len(dilation_list))
- pad0 = int((kernel_size_list[0] - 1) / 2 * dilation_list[0])
- pad1 = int((kernel_size_list[1] - 1) / 2 * dilation_list[1])
- pad2 = int((kernel_size_list[2] - 1) / 2 * dilation_list[2])
- pad3 = int((kernel_size_list[3] - 1) / 2 * dilation_list[3])
- self.conv_1 = nn.Conv2d(in_channels, out_channels_list[0], kernel_size = kernel_size_list[0],
- dilation = dilation_list[0], padding = pad0 )
- self.conv_2 = nn.Conv2d(in_channels, out_channels_list[1], kernel_size = kernel_size_list[1],
- dilation = dilation_list[1], padding = pad1 )
- self.conv_3 = nn.Conv2d(in_channels, out_channels_list[2], kernel_size = kernel_size_list[2],
- dilation = dilation_list[2], padding = pad2 )
- self.conv_4 = nn.Conv2d(in_channels, out_channels_list[3], kernel_size = kernel_size_list[3],
- dilation = dilation_list[3], padding = pad3 )
-
- out_channels = out_channels_list[0] + out_channels_list[1] + out_channels_list[2] + out_channels_list[3]
- self.conv_1x1 = nn.Sequential(
- nn.Conv2d(out_channels, out_channels, kernel_size=1, padding=0),
- nn.BatchNorm2d(out_channels),
- nn.LeakyReLU())
-
- def forward(self, x):
- x1 = self.conv_1(x)
- x2 = self.conv_2(x)
- x3 = self.conv_3(x)
- x4 = self.conv_4(x)
-
- y = torch.cat([x1, x2, x3, x4], dim=1)
- y = self.conv_1x1(y)
- return y
-
-class ConvBNActBlock(nn.Module):
- """
- Two convolution layers with batch norm, leaky relu,
- dropout and SE block.
- """
- def __init__(self,in_channels, out_channels, dropout_p):
- super(ConvBNActBlock, self).__init__()
- self.conv_conv = nn.Sequential(
- nn.Conv2d(in_channels, out_channels, kernel_size=3, padding=1),
- nn.BatchNorm2d(out_channels),
- nn.LeakyReLU(),
- nn.Dropout(dropout_p),
- nn.Conv2d(out_channels, out_channels, kernel_size=3, padding=1),
- nn.BatchNorm2d(out_channels),
- nn.LeakyReLU(),
- SEBlock(out_channels, 2)
- )
-
- def forward(self, x):
- return self.conv_conv(x)
-
-class DownBlock(nn.Module):
- """
- Downsampling by a concantenation of max-pool and avg-pool,
- followed by ConvBNActBlock.
- """
- def __init__(self, in_channels, out_channels, dropout_p):
- super(DownBlock, self).__init__()
- self.maxpool = nn.MaxPool2d(2)
- self.avgpool = nn.AvgPool2d(2)
- self.conv = ConvBNActBlock(2 * in_channels, out_channels, dropout_p)
-
- def forward(self, x):
- x_max = self.maxpool(x)
- x_avg = self.avgpool(x)
- x_cat = torch.cat([x_max, x_avg], dim=1)
- y = self.conv(x_cat)
- return y + x_cat
-
-class UpBlock(nn.Module):
- """
- Upssampling followed by ConvBNActBlock.
- """
- def __init__(self, in_channels1, in_channels2, out_channels,
- up_mode = 2, dropout_p = 0.5):
- super(UpBlock, self).__init__()
- if(isinstance(up_mode, int)):
- up_mode_values = ["transconv", "nearest", "bilinear", "bicubic"]
- if(up_mode > 3):
- raise ValueError("The upsample mode should be 0-3, but {0:} is given.".format(up_mode))
- self.up_mode = up_mode_values[up_mode]
- else:
- self.up_mode = up_mode.lower()
-
- if (self.up_mode == "transconv"):
- self.up = nn.ConvTranspose2d(in_channels1, in_channels2, kernel_size=2, stride=2)
- else:
- self.conv1x1 = nn.Conv2d(in_channels1, in_channels2, kernel_size = 1)
- if(self.up_mode == "nearest"):
- self.up = nn.Upsample(scale_factor=2, mode=self.up_mode)
- else:
- self.up = nn.Upsample(scale_factor=2, mode=self.up_mode, align_corners=True)
- self.conv = ConvBNActBlock(in_channels2 * 2, out_channels, dropout_p)
-
- def forward(self, x1, x2):
- if self.up_mode != "transconv":
- x1 = self.conv1x1(x1)
- x1 = self.up(x1)
- x_cat = torch.cat([x2, x1], dim=1)
- y = self.conv(x_cat)
- return y + x_cat
-
-class COPLENet(nn.Module):
- """
- Implementation of of COPLENet for COVID-19 pneumonia lesion segmentation from CT images.
-
- * Reference: G. Wang et al. `A Noise-robust Framework for Automatic Segmentation of COVID-19 Pneumonia Lesions
- from CT Images `_.
- IEEE Transactions on Medical Imaging, 39(8),2020:2653-2663.
-
- Parameters are given in the `params` dictionary, and should include the
- following fields:
-
- :param in_chns: (int) Input channel number.
- :param feature_chns: (list) Feature channel for each resolution level.
- The length should be 5, such as [16, 32, 64, 128, 256].
- :param dropout: (list) The dropout ratio for each resolution level.
- The length should be the same as that of `feature_chns`.
- :param class_num: (int) The class number for segmentation task.
- :param bilinear: (bool) Using bilinear for up-sampling or not.
- If False, deconvolution will be used for up-sampling.
- """
- def __init__(self, params):
- super(COPLENet, self).__init__()
- self.params = params
- self.in_chns = self.params['in_chns']
- self.ft_chns = self.params['feature_chns']
- self.dropout = self.params['dropout']
- self.n_class = self.params['class_num']
- self.up_mode = self.params.get('up_mode', 2)
- assert(len(self.ft_chns) == 5)
-
- f0_half = int(self.ft_chns[0] / 2)
- f1_half = int(self.ft_chns[1] / 2)
- f2_half = int(self.ft_chns[2] / 2)
- f3_half = int(self.ft_chns[3] / 2)
- self.in_conv= ConvBNActBlock(self.in_chns, self.ft_chns[0], self.dropout[0])
- self.down1 = DownBlock(self.ft_chns[0], self.ft_chns[1], self.dropout[1])
- self.down2 = DownBlock(self.ft_chns[1], self.ft_chns[2], self.dropout[2])
- self.down3 = DownBlock(self.ft_chns[2], self.ft_chns[3], self.dropout[3])
- self.down4 = DownBlock(self.ft_chns[3], self.ft_chns[4], self.dropout[4])
-
- self.bridge0= ConvLayer(self.ft_chns[0], f0_half)
- self.bridge1= ConvLayer(self.ft_chns[1], f1_half)
- self.bridge2= ConvLayer(self.ft_chns[2], f2_half)
- self.bridge3= ConvLayer(self.ft_chns[3], f3_half)
-
- self.up1 = UpBlock(self.ft_chns[4], f3_half, self.ft_chns[3], self.up_mode, dropout_p = self.dropout[3])
- self.up2 = UpBlock(self.ft_chns[3], f2_half, self.ft_chns[2], self.up_mode, dropout_p = self.dropout[2])
- self.up3 = UpBlock(self.ft_chns[2], f1_half, self.ft_chns[1], self.up_mode, dropout_p = self.dropout[1])
- self.up4 = UpBlock(self.ft_chns[1], f0_half, self.ft_chns[0], self.up_mode, dropout_p = self.dropout[0])
-
- f4 = self.ft_chns[4]
- aspp_chns = [int(f4 / 4), int(f4 / 4), int(f4 / 4), int(f4 / 4)]
- aspp_knls = [1, 3, 3, 3]
- aspp_dila = [1, 2, 4, 6]
- self.aspp = ASPPBlock(f4, aspp_chns, aspp_knls, aspp_dila)
-
-
- self.out_conv = nn.Conv2d(self.ft_chns[0], self.n_class,
- kernel_size = 3, padding = 1)
-
- def forward(self, x):
- x_shape = list(x.shape)
- if(len(x_shape) == 5):
- [N, C, D, H, W] = x_shape
- new_shape = [N*D, C, H, W]
- x = torch.transpose(x, 1, 2)
- x = torch.reshape(x, new_shape)
- x0 = self.in_conv(x)
- x0b = self.bridge0(x0)
- x1 = self.down1(x0)
- x1b = self.bridge1(x1)
- x2 = self.down2(x1)
- x2b = self.bridge2(x2)
- x3 = self.down3(x2)
- x3b = self.bridge3(x3)
- x4 = self.down4(x3)
- x4 = self.aspp(x4)
-
- x = self.up1(x4, x3b)
- x = self.up2(x, x2b)
- x = self.up3(x, x1b)
- x = self.up4(x, x0b)
- output = self.out_conv(x)
-
- if(len(x_shape) == 5):
- new_shape = [N, D] + list(output.shape)[1:]
- output = torch.reshape(output, new_shape)
- output = torch.transpose(output, 1, 2)
- return output
\ No newline at end of file
diff --git a/pymic/net/cnn/lcovnet3d.py b/pymic/net/cnn/lcovnet3d.py
deleted file mode 100644
index bd91878..0000000
--- a/pymic/net/cnn/lcovnet3d.py
+++ /dev/null
@@ -1,246 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-
-import logging
-import torch
-import torch.nn as nn
-import numpy as np
-from pymic.net.net_init import Initialization_He, Initialization_XavierUniform
-
-class UnetBlock_Encode(nn.Module):
- def __init__(self, in_channels, out_channel):
- super(UnetBlock_Encode, self).__init__()
-
- self.in_chns = in_channels
- self.out_chns = out_channel
-
- self.conv1 = nn.Sequential(
- nn.Conv3d(self.in_chns, self.out_chns, kernel_size=(1, 1, 3),
- padding=(0, 0, 1)),
- nn.BatchNorm3d(self.out_chns),
- nn.ReLU6(inplace=True)
- )
-
- self.conv2_1 = nn.Sequential(
- nn.Conv3d(self.out_chns, self.out_chns, kernel_size=(3, 3, 1),
- padding=(1, 1, 0), groups=1),
- nn.BatchNorm3d(self.out_chns),
- nn.ReLU6(inplace=True),
- nn.Dropout(p=0.2)
- )
-
- self.conv2_2 = nn.Sequential(
- nn.AvgPool3d(kernel_size=4, stride=2, padding=1),
- nn.Conv3d(self.out_chns, self.out_chns, kernel_size=1,
- padding=0),
- nn.BatchNorm3d(self.out_chns),
- nn.Upsample(scale_factor=2, mode='trilinear', align_corners=False)
- )
-
- def forward(self, x):
- # print(x.shape)
- x = self.conv1(x)
-
- x1 = self.conv2_1(x)
- x2 = self.conv2_2(x)
- x2 = torch.sigmoid(x2)
- x = x1 + x2 * x
- return x
-
-
-class UnetBlock_Encode_BottleNeck(nn.Module):
- def __init__(self, in_channels, out_channel):
- super(UnetBlock_Encode_BottleNeck, self).__init__()
-
- self.in_chns = in_channels
- self.out_chns = out_channel
-
- self.conv1 = nn.Sequential(
- nn.Conv3d(self.in_chns, self.out_chns, kernel_size=(1, 1, 3),
- padding=(0, 0, 1)),
- nn.BatchNorm3d(self.out_chns),
- nn.ReLU6(inplace=True)
- )
-
- self.conv2_1 = nn.Sequential(
- nn.Conv3d(self.out_chns, self.out_chns, kernel_size=(3, 3, 1),
- padding=(1, 1, 0), groups=self.out_chns),
- nn.BatchNorm3d(self.out_chns),
- nn.ReLU6(inplace=True),
- nn.Dropout(p=0.2)
- )
-
- self.conv2_2 = nn.Sequential(
- # nn.AvgPool3d(kernel_size=4, stride=2),
- nn.Conv3d(self.out_chns, self.out_chns, kernel_size=1,
- padding=0),
- nn.BatchNorm3d(self.out_chns),
- nn.ReLU6(inplace=True),
- nn.Dropout(p=0.2)
- )
-
- def forward(self, x):
- x = self.conv1(x)
-
- x1 = self.conv2_1(x)
- x2 = self.conv2_2(x)
- x2 = torch.sigmoid(x2)
- x = x1 + x2 * x
- return x
-
-
-class UnetBlock_Down(nn.Module):
- def __init__(self):
- super(UnetBlock_Down, self).__init__()
- self.avg_pool = nn.MaxPool3d(kernel_size=2, stride=2)
-
- def forward(self, x):
- x = self.avg_pool(x)
- return x
-
-
-class UnetBlock_Up(nn.Module):
- def __init__(self, in_channels, out_channel):
- super(UnetBlock_Up, self).__init__()
- self.conv = self.conv1 = nn.Sequential(
- nn.Conv3d(in_channels, out_channel, kernel_size=1,
- padding=0, groups=1),
- nn.BatchNorm3d(out_channel),
- nn.ReLU6(inplace=True),
- nn.Dropout(p=0.2)
- )
-
- self.up = nn.Upsample(
- scale_factor=2, mode='trilinear', align_corners=False)
-
- def forward(self, x):
- x = self.conv(x)
- x = self.up(x)
- return x
-
-
-class LCOVNet(nn.Module):
- """
- An implementation of the LCOVNet.
-
- * Reference: Q. Zhao, L. Zhong, J. Xiao, J. Zhang, Y. Chen , W. Liao, S. Zhang, and G. Wang:
- Efficient Multi-Organ Segmentation From 3D Abdominal CT Images With Lightweight Network and Knowledge Distillation.
- `IEEE TMI 42(9) 2023: 2513 - 2523. `_
-
- Parameters are given in the `params` dictionary, and should include the
- following fields:
-
- :param in_chns: (int) Input channel number.
- :param feature_chns: (list) Feature channel for each resolution level.
- The length should be 4 or 5, such as [16, 32, 64, 128, 256].
- :param dropout: (list) The dropout ratio for each resolution level.
- The length should be the same as that of `feature_chns`.
- :param class_num: (int) The class number for segmentation task.
- :param up_mode: (string or int) The mode for upsampling. The allowed values are:
- 0 (or `TransConv`), 1 (`Nearest`), 2 (`Trilinear`). The default value
- is 2 (`Trilinear`).
- :param multiscale_pred: (bool) Get multi-scale prediction.
- """
- def __init__(self, params):
- super(LCOVNet, self).__init__()
- params = self.get_default_parameters(params)
- for p in params:
- print(p, params[p])
- self.stage = 'train'
- # C_in=32, n_classes=17, m=1, is_ds=True):
-
- in_chns = params['in_chns']
- n_class = params['class_num']
- self.ft_chns = params['feature_chns']
- self.mul_pred = params.get('multiscale_pred', False)
-
- self.Encode_block1 = UnetBlock_Encode(in_chns, self.ft_chns[0])
- self.down1 = UnetBlock_Down()
-
- self.Encode_block2 = UnetBlock_Encode(self.ft_chns[0], self.ft_chns[1])
- self.down2 = UnetBlock_Down()
-
- self.Encode_block3 = UnetBlock_Encode(self.ft_chns[1], self.ft_chns[2])
- self.down3 = UnetBlock_Down()
-
- self.Encode_block4 = UnetBlock_Encode(self.ft_chns[2], self.ft_chns[3])
- self.down4 = UnetBlock_Down()
-
- self.Encode_BottleNeck_block5 = UnetBlock_Encode_BottleNeck(
- self.ft_chns[3], self.ft_chns[4])
-
- self.up1 = UnetBlock_Up(self.ft_chns[4], self.ft_chns[3])
- self.Decode_block1 = UnetBlock_Encode(
- self.ft_chns[3]*2, self.ft_chns[3])
- self.segout1 = nn.Conv3d(
- self.ft_chns[3], n_class, kernel_size=1, padding=0)
-
- self.up2 = UnetBlock_Up(self.ft_chns[3], self.ft_chns[2])
- self.Decode_block2 = UnetBlock_Encode(
- self.ft_chns[2]*2, self.ft_chns[2])
- self.segout2 = nn.Conv3d(
- self.ft_chns[2], n_class, kernel_size=1, padding=0)
-
- self.up3 = UnetBlock_Up(self.ft_chns[2], self.ft_chns[1])
- self.Decode_block3 = UnetBlock_Encode(
- self.ft_chns[1]*2, self.ft_chns[1])
- self.segout3 = nn.Conv3d(
- self.ft_chns[1], n_class, kernel_size=1, padding=0)
-
- self.up4 = UnetBlock_Up(self.ft_chns[1], self.ft_chns[0])
- self.Decode_block4 = UnetBlock_Encode(
- self.ft_chns[0]*2, self.ft_chns[0])
- self.segout4 = nn.Conv3d(
- self.ft_chns[0], n_class, kernel_size=1, padding=0)
-
- def get_default_parameters(self, params):
- default_param = {
- 'feature_chns': [32, 64, 128, 256, 512],
- 'initialization': 'he',
- 'multiscale_pred': False
- }
- for key in default_param:
- params[key] = params.get(key, default_param[key])
- for key in params:
- logging.info("{0:} = {1:}".format(key, params[key]))
- return params
-
- def forward(self, x):
- _x1 = self.Encode_block1(x)
- x1 = self.down1(_x1)
-
- _x2 = self.Encode_block2(x1)
- x2 = self.down2(_x2)
-
- _x3 = self.Encode_block3(x2)
- x3 = self.down2(_x3)
-
- _x4 = self.Encode_block4(x3)
- x4 = self.down2(_x4)
-
- x5 = self.Encode_BottleNeck_block5(x4)
-
- x6 = self.up1(x5)
- x6 = torch.cat((x6, _x4), dim=1)
- x6 = self.Decode_block1(x6)
- segout1 = self.segout1(x6)
-
- x7 = self.up2(x6)
- x7 = torch.cat((x7, _x3), dim=1)
- x7 = self.Decode_block2(x7)
- segout2 = self.segout2(x7)
-
- x8 = self.up3(x7)
- x8 = torch.cat((x8, _x2), dim=1)
- x8 = self.Decode_block3(x8)
- segout3 = self.segout3(x8)
-
- x9 = self.up4(x8)
- x9 = torch.cat((x9, _x1), dim=1)
- x9 = self.Decode_block4(x9)
- segout4 = self.segout4(x9)
-
- if (self.mul_pred == True and self.stage == 'train'):
- return [segout4, segout3, segout2, segout1]
- else:
- return segout4
\ No newline at end of file
diff --git a/pymic/net/cnn/unet.py b/pymic/net/cnn/unet.py
deleted file mode 100644
index 8dd753e..0000000
--- a/pymic/net/cnn/unet.py
+++ /dev/null
@@ -1,275 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-
-import logging
-import torch
-import torch.nn as nn
-import numpy as np
-from pymic.net.cnn.basic_layer import *
-
-class ConvBlock(nn.Module):
- """
- Two convolution layers with batch norm and leaky relu.
- Droput is used between the two convolution layers.
-
- :param in_channels: (int) Input channel number.
- :param out_channels: (int) Output channel number.
- :param dropout_p: (int) Dropout probability.
- """
- def __init__(self, dim, in_channels, out_channels, dropout_p, kernel_size = 3, padding = 1,
- stride = 1, dilation = 1, norm_type = 'batch_norm'):
- super(ConvBlock, self).__init__()
- conv_nd = get_conv_class(dim)
- norm_nd = get_norm_class(dim, norm_type)
- self.conv_conv = nn.Sequential(
- conv_nd(in_channels, out_channels, kernel_size=kernel_size,
- padding=padding, stride = stride, dilation = dilation),
- norm_nd(out_channels),
- nn.LeakyReLU(),
- nn.Dropout(dropout_p),
- conv_nd(out_channels, out_channels, kernel_size=kernel_size,
- padding=padding, stride = stride, dilation = dilation),
- norm_nd(out_channels),
- nn.LeakyReLU()
- )
-
- def forward(self, x):
- return self.conv_conv(x)
-
-class DownBlock(nn.Module):
- """
- Downsampling followed by ConvBlock
-
- :param in_channels: (int) Input channel number.
- :param out_channels: (int) Output channel number.
- :param dropout_p: (int) Dropout probability.
- """
- def __init__(self, dim, in_channels, out_channels, dropout_p):
- super(DownBlock, self).__init__()
- maxpool_nd = get_maxpool_class(dim)
- self.maxpool_conv = nn.Sequential(
- maxpool_nd(2),
- ConvBlock(dim, in_channels, out_channels, dropout_p)
- )
-
- def forward(self, x):
- return self.maxpool_conv(x)
-
-class UpBlock(nn.Module):
- """
- Upsampling followed by ConvBlock
-
- :param in_channels1: (int) Channel number of high-level features.
- :param in_channels2: (int) Channel number of low-level features.
- :param out_channels: (int) Output channel number.
- :param dropout_p: (int) Dropout probability.
- :param up_mode: (string or int) The mode for upsampling. The allowed values are:
- 0 (or `TransConv`), 1 (`Nearest`), 2 (`Bilinear` for 2D images and 'Trilinear' for 3D images).
- The default value is 2.
- """
- def __init__(self, dim, in_channels1, in_channels2, out_channels, dropout_p, up_mode = 2,
- kernel_size = 3, padding = 1, stride = 1, dilation = 1, norm_type = 'batch_norm'):
- super(UpBlock, self).__init__()
- if(isinstance(up_mode, int)):
- up_mode_values = ["transconv", "nearest", "bilinear"]
- if(up_mode > 2):
- raise ValueError("The upsample mode should be 0-2, but {0:} is given.".format(up_mode))
- self.up_mode = up_mode_values[up_mode]
- if(dim == 3 and up_mode == 2):
- self.up_mode = 'trilinear'
- else:
- self.up_mode = up_mode.lower()
-
- if (self.up_mode == "transconv"):
- transconv_nd = get_transpose_conv_class(dim)
- self.up = transconv_nd(in_channels1, in_channels2, kernel_size=2, stride=2)
- else:
- conv_nd = get_conv_class(dim)
- self.conv1x1 = conv_nd(in_channels1, in_channels2, kernel_size = 1)
- if(self.up_mode == "nearest"):
- self.up = nn.Upsample(scale_factor=2, mode=self.up_mode)
- else:
- self.up = nn.Upsample(scale_factor=2, mode=self.up_mode, align_corners=True)
- self.conv = ConvBlock(dim, in_channels2 * 2, out_channels, dropout_p, kernel_size,
- padding, stride, dilation, norm_type)
-
- def forward(self, x1, x2):
- if self.up_mode != "transconv":
- x1 = self.conv1x1(x1)
- x1 = self.up(x1)
- x = torch.cat([x2, x1], dim=1)
- return self.conv(x)
-
-class Encoder(nn.Module):
- """
- Encoder of 2D UNet.
-
- Parameters are given in the `params` dictionary, and should include the
- following fields:
-
- :param in_chns: (int) Input channel number.
- :param feature_chns: (list) Feature channel for each resolution level.
- The length should be 4 or 5, such as [16, 32, 64, 128, 256].
- :param dropout: (list) The dropout ratio for each resolution level.
- The length should be the same as that of `feature_chns`.
- """
- def __init__(self, params):
- super(Encoder, self).__init__()
- self.params = params
- self.dim = self.params['dimension']
- self.in_chns = self.params['in_chns']
- self.ft_chns = self.params['feature_chns']
- self.dropout = self.params['dropout']
- assert(len(self.ft_chns) == 5)
-
- self.in_conv= ConvBlock(self.dim, self.in_chns, self.ft_chns[0], self.dropout[0])
- self.down1 = DownBlock(self.dim, self.ft_chns[0], self.ft_chns[1], self.dropout[1])
- self.down2 = DownBlock(self.dim, self.ft_chns[1], self.ft_chns[2], self.dropout[2])
- self.down3 = DownBlock(self.dim, self.ft_chns[2], self.ft_chns[3], self.dropout[3])
- self.down4 = DownBlock(self.dim, self.ft_chns[3], self.ft_chns[4], self.dropout[4])
-
- def forward(self, x):
- x0 = self.in_conv(x)
- x1 = self.down1(x0)
- x2 = self.down2(x1)
- x3 = self.down3(x2)
- x4 = self.down4(x3)
- output = [x0, x1, x2, x3, x4]
- return output
-
-class Decoder(nn.Module):
- """
- Decoder of 2D UNet.
-
- Parameters are given in the `params` dictionary, and should include the
- following fields:
-
- :param in_chns: (int) Input channel number.
- :param feature_chns: (list) Feature channel for each resolution level.
- The length should be 4 or 5, such as [16, 32, 64, 128, 256].
- :param dropout: (list) The dropout ratio for each resolution level.
- The length should be the same as that of `feature_chns`.
- :param class_num: (int) The class number for segmentation task.
- :param up_mode: (string or int) The mode for upsampling. The allowed values are:
- 0 (or `TransConv`), 1 (or `Nearest`), 2 (or `Bilinear`), 3 (or `Bicubic`).
- The default value is 2 (or `Bilinear`).
- :param multiscale_pred: (bool) Get multi-scale prediction.
- """
- def __init__(self, params):
- super(Decoder, self).__init__()
- self.params = params
- self.dim = self.params['dimension']
- self.in_chns = self.params['in_chns']
- self.ft_chns = self.params['feature_chns']
- self.dropout = self.params['dropout']
- self.n_class = self.params['class_num']
- self.up_mode = self.params.get('up_mode', 2)
- self.mul_pred = self.params.get('multiscale_pred', False)
-
- assert(len(self.ft_chns) == 5)
-
- self.up1 = UpBlock(self.dim, self.ft_chns[4], self.ft_chns[3], self.ft_chns[3], self.dropout[3], self.up_mode)
- self.up2 = UpBlock(self.dim, self.ft_chns[3], self.ft_chns[2], self.ft_chns[2], self.dropout[2], self.up_mode)
- self.up3 = UpBlock(self.dim, self.ft_chns[2], self.ft_chns[1], self.ft_chns[1], self.dropout[1], self.up_mode)
- self.up4 = UpBlock(self.dim, self.ft_chns[1], self.ft_chns[0], self.ft_chns[0], self.dropout[0], self.up_mode)
- conv_nd = get_conv_class(self.dim)
- self.out_conv = conv_nd(self.ft_chns[0], self.n_class, kernel_size = 1)
-
- if(self.mul_pred and (self.training or self.mul_infer)):
- self.out_conv1 = conv_nd(self.ft_chns[1], self.n_class, kernel_size = 1)
- self.out_conv2 = conv_nd(self.ft_chns[2], self.n_class, kernel_size = 1)
- self.out_conv3 = conv_nd(self.ft_chns[3], self.n_class, kernel_size = 1)
- self.stage = 'train'
-
- def set_stage(self, stage):
- self.stage = stage
-
- def forward(self, x):
- x0, x1, x2, x3, x4 = x
- x_d3 = self.up1(x4, x3)
- x_d2 = self.up2(x_d3, x2)
- x_d1 = self.up3(x_d2, x1)
- x_d0 = self.up4(x_d1, x0)
- output = self.out_conv(x_d0)
- if(self.mul_pred and self.stage == 'train'):
- output1 = self.out_conv1(x_d1)
- output2 = self.out_conv2(x_d2)
- output3 = self.out_conv3(x_d3)
- output = [output, output1, output2, output3]
- return output
-
-class UNet(nn.Module):
- """
- An implementation of 2D U-Net.
-
- * Reference: Olaf Ronneberger, Philipp Fischer, Thomas Brox:
- U-Net: Convolutional Networks for Biomedical Image Segmentation.
- MICCAI (3) 2015: 234-241
-
- Note that there are some modifications from the original paper, such as
- the use of batch normalization, dropout, leaky relu and deep supervision.
-
- Parameters are given in the `params` dictionary, and should include the
- following fields:
-
- :param in_chns: (int) Input channel number.
- :param class_num: (int) The class number for segmentation task.
-
- Optional parameters:
-
- :param feature_chns: (list) Feature channel for each resolution level.
- The length should be 4 or 5, such as [16, 32, 64, 128, 256].
- :param dropout: (list) The dropout ratio for each resolution level.
- The length should be the same as that of `feature_chns`.
- :param up_mode: (string or int) The mode for upsampling. The allowed values are:
- 0 (or `TransConv`), 1 (or `Nearest`), 2 (or `Bilinear`), 3 (or `Bicubic`).
- The default value is 2 (or `Bilinear`).
- :param multiscale_pred: (bool) Get multiscale prediction.
- """
- def __init__(self, params):
- super(UNet, self).__init__()
- params = self.get_default_parameters(params)
- for p in params:
- print(p, params[p])
- self.dim = params['dimension']
- self.encoder = Encoder(params)
- self.decoder = Decoder(params)
-
- def get_default_parameters(self, params):
- default_param = {
- 'dimension': 2,
- 'feature_chns': [32, 64, 128, 256, 512],
- 'dropout': [0.0, 0.0, 0.2, 0.3, 0.4],
- 'up_mode': 2,
- 'multiscale_pred': False
- }
- for key in default_param:
- params[key] = params.get(key, default_param[key])
- for key in params:
- logging.info("{0:} = {1:}".format(key, params[key]))
- return params
-
- def set_stage(self, stage):
- self.stage = stage
- self.decoder.set_stage(stage)
-
- def forward(self, x):
- x_shape = list(x.shape)
- if (self.dim == 2 and len(x_shape) == 5):
- [N, C, D, H, W] = x_shape
- new_shape = [N*D, C, H, W]
- x = torch.transpose(x, 1, 2)
- x = torch.reshape(x, new_shape)
-
- f = self.encoder(x)
- output = self.decoder(f)
-
- if(self.dim == 2 and len(x_shape) == 5):
- if(isinstance(output, (list,tuple))):
- for i in range(len(output)):
- new_shape = [N, D] + list(output[i].shape)[1:]
- output[i] = torch.transpose(torch.reshape(output[i], new_shape), 1, 2)
- else:
- new_shape = [N, D] + list(output.shape)[1:]
- output = torch.transpose(torch.reshape(output, new_shape), 1, 2)
- return output
diff --git a/pymic/net/cnn/unet2d5.py b/pymic/net/cnn/unet2d5.py
deleted file mode 100644
index 4e70393..0000000
--- a/pymic/net/cnn/unet2d5.py
+++ /dev/null
@@ -1,289 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-
-import logging
-import torch
-import torch.nn as nn
-import numpy as np
-
-ConvND = {2: nn.Conv2d, 3: nn.Conv3d}
-BatchNormND = {2: nn.BatchNorm2d, 3: nn.BatchNorm3d}
-MaxPoolND = {2: nn.MaxPool2d, 3: nn.MaxPool3d}
-ConvTransND = {2: nn.ConvTranspose2d, 3: nn.ConvTranspose3d}
-
-class ConvBlockND(nn.Module):
- """
- 2D or 3D convolutional block
-
- :param in_channels: (int) Input channel number.
- :param out_channels: (int) Output channel number.
- :param dim: (int) Should be 2 or 3, for 2D and 3D convolution, respectively.
- :param dropout_p: (int) Dropout probability.
- """
- def __init__(self, in_channels, out_channels, dim = 2, dropout_p = 0.0):
- super(ConvBlockND, self).__init__()
- assert(dim == 2 or dim == 3)
- self.dim = dim
- self.conv_conv = nn.Sequential(
- ConvND[dim](in_channels, out_channels, kernel_size=3, padding=1),
- BatchNormND[dim](out_channels),
- nn.PReLU(),
- nn.Dropout(dropout_p),
- ConvND[dim](out_channels, out_channels, kernel_size=3, padding=1),
- BatchNormND[dim](out_channels),
- nn.PReLU()
- )
-
- def forward(self, x):
- output = self.conv_conv(x)
- return output
-
-class DownBlock(nn.Module):
- """`ConvBlockND` block followed by downsampling.
-
- :param in_channels: (int) Input channel number.
- :param out_channels: (int) Output channel number.
- :param dim: (int) Should be 2 or 3, for 2D and 3D convolution, respectively.
- :param dropout_p: (int) Dropout probability.
- :param downsample: (bool) Use downsample or not after convolution.
- """
- def __init__(self, in_channels, out_channels, dim = 2, dropout_p = 0.0, downsample = True):
- super(DownBlock, self).__init__()
- self.downsample = downsample
- self.dim = dim
- self.conv = ConvBlockND(in_channels, out_channels, dim, dropout_p)
- self.down_layer = MaxPoolND[dim](kernel_size = 2, stride = 2)
-
- def forward(self, x):
- x_shape = list(x.shape)
- if(self.dim == 2 and len(x_shape) == 5):
- [N, C, D, H, W] = x_shape
- new_shape = [N*D, C, H, W]
- x = torch.transpose(x, 1, 2)
- x = torch.reshape(x, new_shape)
- output = self.conv(x)
- if(self.downsample):
- output_d = self.down_layer(output)
- else:
- output_d = None
- if(self.dim == 2 and len(x_shape) == 5):
- new_shape = [N, D] + list(output.shape)[1:]
- output = torch.reshape(output, new_shape)
- output = torch.transpose(output, 1, 2)
- if(self.downsample):
- new_shape = [N, D] + list(output_d.shape)[1:]
- output_d = torch.reshape(output_d, new_shape)
- output_d = torch.transpose(output_d, 1, 2)
-
- return output, output_d
-
-class UpBlock(nn.Module):
- """Upsampling followed by `ConvBlockND` block
-
- :param in_channels1: (int) Input channel number for low-resolution feature map.
- :param in_channels2: (int) Input channel number for high-resolution feature map.
- :param out_channels: (int) Output channel number.
- :param dim: (int) Should be 2 or 3, for 2D and 3D convolution, respectively.
- :param dropout_p: (int) Dropout probability.
- :param up_mode: (string or int) The mode for upsampling. The allowed values are:
- 0 (or `TransConv`), 1 (`Nearest`), 2 (`Trilinear` for 3D and `Bilinear` for 2D).
- The default value is 2.
- """
- def __init__(self, in_channels1, in_channels2, out_channels,
- dim = 2, dropout_p = 0.0, up_mode= 2):
- super(UpBlock, self).__init__()
- if(isinstance(up_mode, int)):
- up_mode_values = ["transconv", "nearest", "trilinear"]
- if(up_mode > 2):
- raise ValueError("The upsample mode should be 0-2, but {0:} is given.".format(up_mode))
- self.up_mode = up_mode_values[up_mode]
- else:
- self.up_mode = up_mode.lower()
-
- self.dim = dim
- if (self.up_mode == "transconv"):
- self.up = ConvTransND[dim](in_channels1, in_channels2, kernel_size=2, stride=2)
- else:
- self.conv1x1 = ConvND[dim](in_channels1, in_channels2, kernel_size = 1)
- if(self.up_mode == "nearest"):
- self.up = nn.Upsample(scale_factor=2, mode=self.up_mode)
- else:
- mode = "trilinear" if dim == 3 else "bilinear"
- self.up = nn.Upsample(scale_factor=2, mode=mode, align_corners=True)
- self.conv = ConvBlockND(in_channels2 * 2, out_channels, dim, dropout_p)
-
- def forward(self, x1, x2):
- x1_shape = list(x1.shape)
- x2_shape = list(x2.shape)
- if(self.dim == 2 and len(x1_shape) == 5):
- [N, C, D, H, W] = x1_shape
- new_shape = [N*D, C, H, W]
- x1 = torch.transpose(x1, 1, 2)
- x1 = torch.reshape(x1, new_shape)
- [N, C, D, H, W] = x2_shape
- new_shape = [N*D, C, H, W]
- x2 = torch.transpose(x2, 1, 2)
- x2 = torch.reshape(x2, new_shape)
-
- if self.up_mode != "transconv":
- x1 = self.conv1x1(x1)
- x1 = self.up(x1)
- output = torch.cat([x2, x1], dim=1)
- output = self.conv(output)
- if(self.dim == 2 and len(x1_shape) == 5):
- new_shape = [N, D] + list(output.shape)[1:]
- output = torch.reshape(output, new_shape)
- output = torch.transpose(output, 1, 2)
- return output
-
-class Encoder(nn.Module):
- """
- A modification of the encoder of 3D UNet by using ConvScSEBlock3D
-
- Parameters are given in the `params` dictionary.
- See :mod:`pymic.net.net3d.unet3d.Encoder` for details.
- """
- def __init__(self, params):
- super(Encoder, self).__init__()
- self.params = params
- self.in_chns = self.params['in_chns']
- self.n_class = self.params['class_num']
- self.ft_chns = self.params['feature_chns']
- self.dropout = self.params['dropout']
- self.dims = self.params['conv_dims']
-
- self.block0 = DownBlock(self.in_chns, self.ft_chns[0], self.dims[0], self.dropout[0], True)
- self.block1 = DownBlock(self.ft_chns[0], self.ft_chns[1], self.dims[1], self.dropout[1], True)
- self.block2 = DownBlock(self.ft_chns[1], self.ft_chns[2], self.dims[2], self.dropout[2], True)
- self.block3 = DownBlock(self.ft_chns[2], self.ft_chns[3], self.dims[3], self.dropout[3], True)
- self.block4 = DownBlock(self.ft_chns[3], self.ft_chns[4], self.dims[4], self.dropout[4], False)
-
- def forward(self, x):
- x0, x0_d = self.block0(x)
- x1, x1_d = self.block1(x0_d)
- x2, x2_d = self.block2(x1_d)
- x3, x3_d = self.block3(x2_d)
- x4, x4_d = self.block4(x3_d)
- return [x0, x1, x2, x3, x4]
-
-class Decoder(nn.Module):
- """
- Decoder of 3D UNet.
-
- Parameters are given in the `params` dictionary, and should include the
- following fields:
-
- :param in_chns: (int) Input channel number.
- :param feature_chns: (list) Feature channel for each resolution level.
- The length should be 4 or 5, such as [16, 32, 64, 128, 256].
- :param dropout: (list) The dropout ratio for each resolution level.
- The length should be the same as that of `feature_chns`.
- :param class_num: (int) The class number for segmentation task.
- :param up_mode: (string or int) The mode for upsampling. The allowed values are:
- 0 (or `TransConv`), 1 (`Nearest`), 2 (`Trilinear` for 3D and `Bilinear` for 2D).
- The default value is 2.
- :param multiscale_pred: (bool) Get multi-scale prediction.
- """
- def __init__(self, params):
- super(Decoder, self).__init__()
- self.params = params
- self.in_chns = self.params['in_chns']
- self.n_class = self.params['class_num']
- self.ft_chns = self.params['feature_chns']
- self.dropout = self.params['dropout']
- self.dims = self.params['conv_dims']
- self.up_mode = self.params.get('up_mode', 2)
- self.mul_pred = self.params.get('multiscale_pred', False)
-
- self.up1 = UpBlock(self.ft_chns[4], self.ft_chns[3], self.ft_chns[3],
- self.dims[3], dropout_p = self.dropout[3], up_mode=self.up_mode)
- self.up2 = UpBlock(self.ft_chns[3], self.ft_chns[2], self.ft_chns[2],
- self.dims[2], dropout_p = self.dropout[2], up_mode=self.up_mode)
- self.up3 = UpBlock(self.ft_chns[2], self.ft_chns[1], self.ft_chns[1],
- self.dims[1], dropout_p = self.dropout[1], up_mode=self.up_mode)
- self.up4 = UpBlock(self.ft_chns[1], self.ft_chns[0], self.ft_chns[0],
- self.dims[0], dropout_p = self.dropout[0], up_mode=self.up_mode)
-
- self.out_conv = nn.Conv3d(self.ft_chns[0], self.n_class, kernel_size = 1)
- if(self.mul_pred):
- self.out_conv1 = nn.Conv3d(self.ft_chns[1], self.n_class, kernel_size = 1)
- self.out_conv2 = nn.Conv3d(self.ft_chns[2], self.n_class, kernel_size = 1)
- self.out_conv3 = nn.Conv3d(self.ft_chns[3], self.n_class, kernel_size = 1)
- self.stage = 'train'
-
- def set_stage(self, stage):
- self.stage = stage
-
- def forward(self, x):
- x0, x1, x2, x3, x4 = x
- x_d3 = self.up1(x4, x3)
- x_d2 = self.up2(x_d3, x2)
- x_d1 = self.up3(x_d2, x1)
- x_d0 = self.up4(x_d1, x0)
- output = self.out_conv(x_d0)
- if(self.mul_pred and self.stage == 'train'):
- output1 = self.out_conv1(x_d1)
- output2 = self.out_conv2(x_d2)
- output3 = self.out_conv3(x_d3)
- output = [output, output1, output2, output3]
- return output
-
-class UNet2D5(nn.Module):
- """
- A 2.5D network combining 3D convolutions with 2D convolutions.
-
- * Reference: Guotai Wang, Jonathan Shapey, Wenqi Li, Reuben Dorent, Alex Demitriadis,
- Sotirios Bisdas, Ian Paddick, Robert Bradford, Shaoting Zhang, Sébastien Ourselin,
- Tom Vercauteren: Automatic Segmentation of Vestibular Schwannoma from T2-Weighted
- MRI by Deep Spatial Attention with Hardness-Weighted Loss.
- `MICCAI (2) 2019: 264-272. `_
-
- Note that the attention module in the orininal paper is not used here.
-
- Parameters are given in the `params` dictionary, and should include the
- following fields:
-
- :param in_chns: (int) Input channel number.
- :param feature_chns: (list) Feature channel for each resolution level.
- The length should be 5, such as [16, 32, 64, 128, 256].
- :param dropout: (list) The dropout ratio for each resolution level.
- The length should be the same as that of `feature_chns`.
- :param conv_dims: (list) The convolution dimension (2 or 3) for each resolution level.
- The length should be the same as that of `feature_chns`.
- :param class_num: (int) The class number for segmentation task.
- :param up_mode: (string or int) The mode for upsampling. The allowed values are:
- 0 (or `TransConv`), 1 (`Nearest`), 2 (`Trilinear`). The default value
- is 2 (`Trilinear`).
- :param multiscale_pred: (bool) Get multi-scale prediction.
- """
- def __init__(self, params):
- super(UNet2D5, self).__init__()
- params = self.get_default_parameters(params)
- for p in params:
- print(p, params[p])
- self.stage = 'train'
- self.encoder = Encoder(params)
- self.decoder = Decoder(params)
-
- def get_default_parameters(self, params):
- default_param = {
- 'feature_chns': [32, 64, 128, 256, 512],
- 'dropout': [0.0, 0.0, 0.2, 0.3, 0.4],
- 'conv_dims':[2, 2, 3, 3, 3],
- 'up_mode': 2,
- 'multiscale_pred': False
- }
- for key in default_param:
- params[key] = params.get(key, default_param[key])
- for key in params:
- logging.info("{0:} = {1:}".format(key, params[key]))
- return params
-
- def set_stage(self, stage):
- self.stage = stage
- self.decoder.set_stage(stage)
-
- def forward(self, x):
- f = self.encoder(x)
- output = self.decoder(f)
- return output
diff --git a/pymic/net/cnn/unet2d_canet.py b/pymic/net/cnn/unet2d_canet.py
deleted file mode 100644
index 73303cc..0000000
--- a/pymic/net/cnn/unet2d_canet.py
+++ /dev/null
@@ -1,1224 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-import numpy as np
-import torch
-import torch.nn as nn
-from torch.nn import init
-from torch.nn import functional as F
-
-## init
-def weights_init_normal(m):
- classname = m.__class__.__name__
- #print(classname)
- if classname.find('Conv') != -1:
- init.normal_(m.weight.data, 0.0, 0.02)
- elif classname.find('Linear') != -1:
- init.normal_(m.weight.data, 0.0, 0.02)
- elif classname.find('BatchNorm') != -1:
- init.normal_(m.weight.data, 1.0, 0.02)
- init.constant_(m.bias.data, 0.0)
-
-
-def weights_init_xavier(m):
- classname = m.__class__.__name__
- #print(classname)
- if classname.find('Conv') != -1:
- init.xavier_normal_(m.weight.data, gain=1)
- elif classname.find('Linear') != -1:
- init.xavier_normal_(m.weight.data, gain=1)
- elif classname.find('BatchNorm') != -1:
- init.normal_(m.weight.data, 1.0, 0.02)
- init.constant_(m.bias.data, 0.0)
-
-
-def weights_init_kaiming(m):
- classname = m.__class__.__name__
- #print(classname)
- if classname.find('Conv') != -1:
- init.kaiming_normal_(m.weight.data, a=0, mode='fan_in')
- elif classname.find('Linear') != -1:
- init.kaiming_normal_(m.weight.data, a=0, mode='fan_in')
- elif classname.find('BatchNorm') != -1:
- init.normal_(m.weight.data, 1.0, 0.02)
- init.constant_(m.bias.data, 0.0)
-
-
-def weights_init_orthogonal(m):
- classname = m.__class__.__name__
- #print(classname)
- if classname.find('Conv') != -1:
- init.orthogonal_(m.weight.data, gain=1)
- elif classname.find('Linear') != -1:
- init.orthogonal_(m.weight.data, gain=1)
- elif classname.find('BatchNorm') != -1:
- init.normal_(m.weight.data, 1.0, 0.02)
- init.constant_(m.bias.data, 0.0)
-
-
-def init_weights(net, init_type='normal'):
- #print('initialization method [%s]' % init_type)
- if init_type == 'normal':
- net.apply(weights_init_normal)
- elif init_type == 'xavier':
- net.apply(weights_init_xavier)
- elif init_type == 'kaiming':
- net.apply(weights_init_kaiming)
- elif init_type == 'orthogonal':
- net.apply(weights_init_orthogonal)
- else:
- raise NotImplementedError('initialization method [%s] is not implemented' % init_type)
-
-## 1, modules
-def conv1x1(in_planes, out_planes, stride=1, bias=False):
- "1x1 convolution"
- return nn.Conv2d(in_planes, out_planes, kernel_size=1, stride=stride,
- padding=0, bias=bias)
-
-
-def conv3x3(in_planes, out_planes, stride=1, bias=False, group=1):
- """3x3 convolution with padding"""
- return nn.Conv2d(in_planes, out_planes, kernel_size=3, stride=stride,padding=1, groups=group, bias=bias)
-
-# conv_block(nn.Module) for U-net convolution block
-class conv_block(nn.Module):
- def __init__(self, ch_in, ch_out, drop_out=False):
- super(conv_block, self).__init__()
- self.conv = nn.Sequential(
- nn.Conv2d(ch_in, ch_out, kernel_size=3, stride=1, padding=1, bias=True),
- nn.BatchNorm2d(ch_out),
- nn.ReLU(inplace=True),
- nn.Conv2d(ch_out, ch_out, kernel_size=3, stride=1, padding=1, bias=True),
- nn.BatchNorm2d(ch_out),
- nn.ReLU(inplace=True),
- )
- self.dropout = drop_out
-
- def forward(self, x):
- x = self.conv(x)
- if self.dropout:
- x = nn.Dropout2d(0.5)(x)
- return x
-
-
-# # UpCat(nn.Module) for U-net UP convolution
-class UpCat(nn.Module):
- def __init__(self, in_feat, out_feat, is_deconv=True):
- super(UpCat, self).__init__()
-
- if is_deconv:
- self.up = nn.ConvTranspose2d(in_feat, out_feat, kernel_size=2, stride=2)
- else:
- self.up = nn.Upsample(scale_factor=2, mode='bilinear')
-
- def forward(self, inputs, down_outputs):
- # TODO: Upsampling required after deconv?
- outputs = self.up(down_outputs)
- offset = inputs.size()[3] - outputs.size()[3]
- if offset == 1:
- addition = torch.rand((outputs.size()[0], outputs.size()[1], outputs.size()[2]), out=None).unsqueeze(
- 3).cuda()
- outputs = torch.cat([outputs, addition], dim=3)
- elif offset > 1:
- addition = torch.rand((outputs.size()[0], outputs.size()[1], outputs.size()[2], offset), out=None).cuda()
- outputs = torch.cat([outputs, addition], dim=3)
- out = torch.cat([inputs, outputs], dim=1)
-
- return out
-
-
-# # UpCatconv(nn.Module) for up convolution
-class UpCatconv(nn.Module):
- def __init__(self, in_feat, out_feat, is_deconv=True, drop_out=False):
- super(UpCatconv, self).__init__()
-
- if is_deconv:
- self.conv = conv_block(in_feat, out_feat, drop_out=drop_out)
- self.up = nn.ConvTranspose2d(in_feat, out_feat, kernel_size=2, stride=2)
- else:
- self.conv = conv_block(in_feat + out_feat, out_feat, drop_out=drop_out)
- self.up = nn.Upsample(scale_factor=2, mode='bilinear')
-
- def forward(self, inputs, down_outputs):
- # TODO: Upsampling required after deconv
- outputs = self.up(down_outputs)
- offset = inputs.size()[3] - outputs.size()[3]
- if offset == 1:
- addition = torch.rand((outputs.size()[0], outputs.size()[1], outputs.size()[2]), out=None).unsqueeze(
- 3).cuda()
- outputs = torch.cat([outputs, addition], dim=3)
- elif offset > 1:
- addition = torch.rand((outputs.size()[0], outputs.size()[1], outputs.size()[2], offset), out=None).cuda()
- outputs = torch.cat([outputs, addition], dim=3)
- out = self.conv(torch.cat([inputs, outputs], dim=1))
-
- return out
-
-
-
-class _GridAttentionBlockND(nn.Module):
- def __init__(self, in_channels, gating_channels, inter_channels=None, dimension=3, mode='concatenation',
- sub_sample_factor=(2,2,2)):
- super(_GridAttentionBlockND, self).__init__()
-
- assert dimension in [2, 3]
- assert mode in ['concatenation', 'concatenation_debug', 'concatenation_residual']
-
- # Downsampling rate for the input featuremap
- if isinstance(sub_sample_factor, tuple): self.sub_sample_factor = sub_sample_factor
- elif isinstance(sub_sample_factor, list): self.sub_sample_factor = tuple(sub_sample_factor)
- else: self.sub_sample_factor = tuple([sub_sample_factor]) * dimension
-
- # Default parameter set
- self.mode = mode
- self.dimension = dimension
- self.sub_sample_kernel_size = self.sub_sample_factor
-
- # Number of channels (pixel dimensions)
- self.in_channels = in_channels
- self.gating_channels = gating_channels
- self.inter_channels = inter_channels
-
- if self.inter_channels is None:
- self.inter_channels = in_channels // 2
- if self.inter_channels == 0:
- self.inter_channels = 1
-
- if dimension == 3:
- conv_nd = nn.Conv3d
- bn = nn.BatchNorm3d
- self.upsample_mode = 'trilinear'
- elif dimension == 2:
- conv_nd = nn.Conv2d
- bn = nn.BatchNorm2d
- self.upsample_mode = 'bilinear'
- else:
- raise NotImplemented
-
- # Output transform
- self.W = nn.Sequential(
- conv_nd(in_channels=self.in_channels, out_channels=self.in_channels, kernel_size=1, stride=1, padding=0),
- bn(self.in_channels),
- )
-
- # Theta^T * x_ij + Phi^T * gating_signal + bias
- self.theta = conv_nd(in_channels=self.in_channels, out_channels=self.inter_channels,
- kernel_size=self.sub_sample_kernel_size, stride=self.sub_sample_factor, padding=0, bias=True)
- self.phi = conv_nd(in_channels=self.gating_channels, out_channels=self.inter_channels,
- kernel_size=(1, 1), stride=1, padding=0, bias=True)
- self.psi = conv_nd(in_channels=self.inter_channels, out_channels=1, kernel_size=1, stride=1, padding=0, bias=True)
-
- # Initialise weights
- for m in self.children():
- init_weights(m, init_type='kaiming')
-
- # Define the operation
- if mode == 'concatenation':
- self.operation_function = self._concatenation
- elif mode == 'concatenation_debug':
- self.operation_function = self._concatenation_debug
- elif mode == 'concatenation_residual':
- self.operation_function = self._concatenation_residual
- else:
- raise NotImplementedError('Unknown operation function.')
-
-
- def forward(self, x, g):
- '''
- :param x: (b, c, t, h, w)
- :param g: (b, g_d)
- :return:
- '''
-
- output = self.operation_function(x, g)
- return output
-
- def _concatenation(self, x, g):
- input_size = x.size()
- batch_size = input_size[0]
- assert batch_size == g.size(0)
-
- # theta => (b, c, t, h, w) -> (b, i_c, t, h, w) -> (b, i_c, thw)
- # phi => (b, g_d) -> (b, i_c)
- theta_x = self.theta(x)
- theta_x_size = theta_x.size()
-
- # g (b, c, t', h', w') -> phi_g (b, i_c, t', h', w')
- # Relu(theta_x + phi_g + bias) -> f = (b, i_c, thw) -> (b, i_c, t/s1, h/s2, w/s3)
- phi_g = F.interpolate(self.phi(g), size=theta_x_size[2:], mode=self.upsample_mode)
- f = F.relu(theta_x + phi_g, inplace=True)
-
- # psi^T * f -> (b, psi_i_c, t/s1, h/s2, w/s3)
- sigm_psi_f = torch.sigmoid(self.psi(f))
-
- # upsample the attentions and multiply
- sigm_psi_f = F.interpolate(sigm_psi_f, size=input_size[2:], mode=self.upsample_mode)
- y = sigm_psi_f.expand_as(x) * x
- W_y = self.W(y)
-
- return W_y, sigm_psi_f
-
- def _concatenation_debug(self, x, g):
- input_size = x.size()
- batch_size = input_size[0]
- assert batch_size == g.size(0)
-
- # theta => (b, c, t, h, w) -> (b, i_c, t, h, w) -> (b, i_c, thw)
- # phi => (b, g_d) -> (b, i_c)
- theta_x = self.theta(x)
- theta_x_size = theta_x.size()
-
- # g (b, c, t', h', w') -> phi_g (b, i_c, t', h', w')
- # Relu(theta_x + phi_g + bias) -> f = (b, i_c, thw) -> (b, i_c, t/s1, h/s2, w/s3)
- phi_g = F.interpolate(self.phi(g), size=theta_x_size[2:], mode=self.upsample_mode)
- f = F.softplus(theta_x + phi_g)
-
- # psi^T * f -> (b, psi_i_c, t/s1, h/s2, w/s3)
- sigm_psi_f = torch.sigmoid(self.psi(f))
-
- # upsample the attentions and multiply
- sigm_psi_f = F.interpolate(sigm_psi_f, size=input_size[2:], mode=self.upsample_mode)
- y = sigm_psi_f.expand_as(x) * x
- W_y = self.W(y)
-
- return W_y, sigm_psi_f
-
-
- def _concatenation_residual(self, x, g):
- input_size = x.size()
- batch_size = input_size[0]
- assert batch_size == g.size(0)
-
- # theta => (b, c, t, h, w) -> (b, i_c, t, h, w) -> (b, i_c, thw)
- # phi => (b, g_d) -> (b, i_c)
- theta_x = self.theta(x)
- theta_x_size = theta_x.size()
-
- # g (b, c, t', h', w') -> phi_g (b, i_c, t', h', w')
- # Relu(theta_x + phi_g + bias) -> f = (b, i_c, thw) -> (b, i_c, t/s1, h/s2, w/s3)
- phi_g = F.interpolate(self.phi(g), size=theta_x_size[2:], mode=self.upsample_mode)
- f = F.relu(theta_x + phi_g, inplace=True)
-
- # psi^T * f -> (b, psi_i_c, t/s1, h/s2, w/s3)
- f = self.psi(f).view(batch_size, 1, -1)
- sigm_psi_f = F.softmax(f, dim=2).view(batch_size, 1, *theta_x.size()[2:])
-
- # upsample the attentions and multiply
- sigm_psi_f = F.interpolate(sigm_psi_f, size=input_size[2:], mode=self.upsample_mode)
- y = sigm_psi_f.expand_as(x) * x
- W_y = self.W(y)
-
- return W_y, sigm_psi_f
-
-
-class GridAttentionBlock2D(_GridAttentionBlockND):
- def __init__(self, in_channels, gating_channels, inter_channels=None, mode='concatenation',
- sub_sample_factor=(2, 2)):
- super(GridAttentionBlock2D, self).__init__(in_channels,
- inter_channels=inter_channels,
- gating_channels=gating_channels,
- dimension=2, mode=mode,
- sub_sample_factor=sub_sample_factor,
- )
-
-
-## 2, channel attention
-class SE_Conv_Block(nn.Module):
- expansion = 4
-
- def __init__(self, inplanes, planes, stride=1, downsample=None, drop_out=False):
- super(SE_Conv_Block, self).__init__()
- self.conv1 = conv3x3(inplanes, planes, stride)
- self.bn1 = nn.BatchNorm2d(planes)
- self.relu = nn.ReLU(inplace=True)
- self.conv2 = conv3x3(planes, planes * 2)
- self.bn2 = nn.BatchNorm2d(planes * 2)
- self.conv3 = conv3x3(planes * 2, planes)
- self.bn3 = nn.BatchNorm2d(planes)
- self.downsample = downsample
- self.stride = stride
- self.dropout = drop_out
-
- self.globalAvgPool = nn.AdaptiveAvgPool2d(1)
- self.globalMaxPool = nn.AdaptiveMaxPool2d(1)
-
- self.fc1 = nn.Linear(in_features=planes * 2, out_features=round(planes / 2))
- self.fc2 = nn.Linear(in_features=round(planes / 2), out_features=planes * 2)
- self.sigmoid = nn.Sigmoid()
-
- self.downchannel = None
- if inplanes != planes:
- self.downchannel = nn.Sequential(nn.Conv2d(inplanes, planes * 2, kernel_size=1, stride=stride, bias=False),
- nn.BatchNorm2d(planes * 2),)
-
- def forward(self, x):
- residual = x
-
- out = self.conv1(x)
- out = self.bn1(out)
- out = self.relu(out)
-
- out = self.conv2(out)
- out = self.bn2(out)
-
- if self.downchannel is not None:
- residual = self.downchannel(x)
-
- original_out = out
- out1 = out
- # For global average pool
- out = self.globalAvgPool(out)
- out = out.view(out.size(0), -1)
- out = self.fc1(out)
- out = self.relu(out)
- out = self.fc2(out)
- out = self.sigmoid(out)
- out = out.view(out.size(0), out.size(1), 1, 1)
- avg_att = out
- out = out * original_out
- # For global maximum pool
- out1 = self.globalMaxPool(out1)
- out1 = out1.view(out1.size(0), -1)
- out1 = self.fc1(out1)
- out1 = self.relu(out1)
- out1 = self.fc2(out1)
- out1 = self.sigmoid(out1)
- out1 = out1.view(out1.size(0), out1.size(1), 1, 1)
- max_att = out1
- out1 = out1 * original_out
-
- att_weight = avg_att + max_att
- out += out1
- out += residual
- out = self.relu(out)
-
- out = self.conv3(out)
- out = self.bn3(out)
- out = self.relu(out)
- if self.dropout:
- out = nn.Dropout2d(0.5)(out)
-
- return out, att_weight
-
-## 3, grid attention
-class _GridAttentionBlockND(nn.Module):
- def __init__(self, in_channels, gating_channels, inter_channels=None, dimension=3, mode='concatenation',
- sub_sample_factor=(2,2,2)):
- super(_GridAttentionBlockND, self).__init__()
-
- assert dimension in [2, 3]
- assert mode in ['concatenation', 'concatenation_debug', 'concatenation_residual']
-
- # Downsampling rate for the input featuremap
- if isinstance(sub_sample_factor, tuple): self.sub_sample_factor = sub_sample_factor
- elif isinstance(sub_sample_factor, list): self.sub_sample_factor = tuple(sub_sample_factor)
- else: self.sub_sample_factor = tuple([sub_sample_factor]) * dimension
-
- # Default parameter set
- self.mode = mode
- self.dimension = dimension
- self.sub_sample_kernel_size = self.sub_sample_factor
-
- # Number of channels (pixel dimensions)
- self.in_channels = in_channels
- self.gating_channels = gating_channels
- self.inter_channels = inter_channels
-
- if self.inter_channels is None:
- self.inter_channels = in_channels // 2
- if self.inter_channels == 0:
- self.inter_channels = 1
-
- if dimension == 3:
- conv_nd = nn.Conv3d
- bn = nn.BatchNorm3d
- self.upsample_mode = 'trilinear'
- elif dimension == 2:
- conv_nd = nn.Conv2d
- bn = nn.BatchNorm2d
- self.upsample_mode = 'bilinear'
- else:
- raise NotImplemented
-
- # Output transform
- self.W = nn.Sequential(
- conv_nd(in_channels=self.in_channels, out_channels=self.in_channels, kernel_size=1, stride=1, padding=0),
- bn(self.in_channels),
- )
-
- # Theta^T * x_ij + Phi^T * gating_signal + bias
- self.theta = conv_nd(in_channels=self.in_channels, out_channels=self.inter_channels,
- kernel_size=self.sub_sample_kernel_size, stride=self.sub_sample_factor, padding=0, bias=True)
- self.phi = conv_nd(in_channels=self.gating_channels, out_channels=self.inter_channels,
- kernel_size=(1, 1), stride=1, padding=0, bias=True)
- self.psi = conv_nd(in_channels=self.inter_channels, out_channels=1, kernel_size=1, stride=1, padding=0, bias=True)
-
- # Initialise weights
- for m in self.children():
- init_weights(m, init_type='kaiming')
-
- # Define the operation
- if mode == 'concatenation':
- self.operation_function = self._concatenation
- elif mode == 'concatenation_debug':
- self.operation_function = self._concatenation_debug
- elif mode == 'concatenation_residual':
- self.operation_function = self._concatenation_residual
- else:
- raise NotImplementedError('Unknown operation function.')
-
-
- def forward(self, x, g):
- '''
- :param x: (b, c, t, h, w)
- :param g: (b, g_d)
- :return:
- '''
-
- output = self.operation_function(x, g)
- return output
-
- def _concatenation(self, x, g):
- input_size = x.size()
- batch_size = input_size[0]
- assert batch_size == g.size(0)
-
- # theta => (b, c, t, h, w) -> (b, i_c, t, h, w) -> (b, i_c, thw)
- # phi => (b, g_d) -> (b, i_c)
- theta_x = self.theta(x)
- theta_x_size = theta_x.size()
-
- # g (b, c, t', h', w') -> phi_g (b, i_c, t', h', w')
- # Relu(theta_x + phi_g + bias) -> f = (b, i_c, thw) -> (b, i_c, t/s1, h/s2, w/s3)
- phi_g = F.interpolate(self.phi(g), size=theta_x_size[2:], mode=self.upsample_mode)
- f = F.relu(theta_x + phi_g, inplace=True)
-
- # psi^T * f -> (b, psi_i_c, t/s1, h/s2, w/s3)
- sigm_psi_f = torch.sigmoid(self.psi(f))
-
- # upsample the attentions and multiply
- sigm_psi_f = F.interpolate(sigm_psi_f, size=input_size[2:], mode=self.upsample_mode)
- y = sigm_psi_f.expand_as(x) * x
- W_y = self.W(y)
-
- return W_y, sigm_psi_f
-
- def _concatenation_debug(self, x, g):
- input_size = x.size()
- batch_size = input_size[0]
- assert batch_size == g.size(0)
-
- # theta => (b, c, t, h, w) -> (b, i_c, t, h, w) -> (b, i_c, thw)
- # phi => (b, g_d) -> (b, i_c)
- theta_x = self.theta(x)
- theta_x_size = theta_x.size()
-
- # g (b, c, t', h', w') -> phi_g (b, i_c, t', h', w')
- # Relu(theta_x + phi_g + bias) -> f = (b, i_c, thw) -> (b, i_c, t/s1, h/s2, w/s3)
- phi_g = F.interpolate(self.phi(g), size=theta_x_size[2:], mode=self.upsample_mode)
- f = F.softplus(theta_x + phi_g)
-
- # psi^T * f -> (b, psi_i_c, t/s1, h/s2, w/s3)
- sigm_psi_f = torch.sigmoid(self.psi(f))
-
- # upsample the attentions and multiply
- sigm_psi_f = F.interpolate(sigm_psi_f, size=input_size[2:], mode=self.upsample_mode)
- y = sigm_psi_f.expand_as(x) * x
- W_y = self.W(y)
-
- return W_y, sigm_psi_f
-
-
- def _concatenation_residual(self, x, g):
- input_size = x.size()
- batch_size = input_size[0]
- assert batch_size == g.size(0)
-
- # theta => (b, c, t, h, w) -> (b, i_c, t, h, w) -> (b, i_c, thw)
- # phi => (b, g_d) -> (b, i_c)
- theta_x = self.theta(x)
- theta_x_size = theta_x.size()
-
- # g (b, c, t', h', w') -> phi_g (b, i_c, t', h', w')
- # Relu(theta_x + phi_g + bias) -> f = (b, i_c, thw) -> (b, i_c, t/s1, h/s2, w/s3)
- phi_g = F.interpolate(self.phi(g), size=theta_x_size[2:], mode=self.upsample_mode)
- f = F.relu(theta_x + phi_g, inplace=True)
-
- # psi^T * f -> (b, psi_i_c, t/s1, h/s2, w/s3)
- f = self.psi(f).view(batch_size, 1, -1)
- sigm_psi_f = F.softmax(f, dim=2).view(batch_size, 1, *theta_x.size()[2:])
-
- # upsample the attentions and multiply
- sigm_psi_f = F.interpolate(sigm_psi_f, size=input_size[2:], mode=self.upsample_mode)
- y = sigm_psi_f.expand_as(x) * x
- W_y = self.W(y)
-
- return W_y, sigm_psi_f
-
-
-class GridAttentionBlock2D(_GridAttentionBlockND):
- def __init__(self, in_channels, gating_channels, inter_channels=None, mode='concatenation',
- sub_sample_factor=(2, 2)):
- super(GridAttentionBlock2D, self).__init__(in_channels,
- inter_channels=inter_channels,
- gating_channels=gating_channels,
- dimension=2, mode=mode,
- sub_sample_factor=sub_sample_factor,
- )
-
-class MultiAttentionBlock(nn.Module):
- def __init__(self, in_size, gate_size, inter_size, nonlocal_mode, sub_sample_factor):
- super(MultiAttentionBlock, self).__init__()
- self.gate_block_1 = GridAttentionBlock2D(in_channels=in_size, gating_channels=gate_size,
- inter_channels=inter_size, mode=nonlocal_mode,
- sub_sample_factor=sub_sample_factor)
- self.gate_block_2 = GridAttentionBlock2D(in_channels=in_size, gating_channels=gate_size,
- inter_channels=inter_size, mode=nonlocal_mode,
- sub_sample_factor=sub_sample_factor)
- self.combine_gates = nn.Sequential(nn.Conv2d(in_size*2, in_size, kernel_size=1, stride=1, padding=0),
- nn.BatchNorm2d(in_size),
- nn.ReLU(inplace=True))
-
- # initialise the blocks
- for m in self.children():
- if m.__class__.__name__.find('GridAttentionBlock2D') != -1: continue
- init_weights(m, init_type='kaiming')
-
- def forward(self, input, gating_signal):
- gate_1, attention_1 = self.gate_block_1(input, gating_signal)
- gate_2, attention_2 = self.gate_block_2(input, gating_signal)
-
- return self.combine_gates(torch.cat([gate_1, gate_2], 1)), torch.cat([attention_1, attention_2], 1)
-
-## 4, Non-local layers
-class _NonLocalBlockND(nn.Module):
- def __init__(self, in_channels, inter_channels=None, dimension=3, mode='embedded_gaussian',
- sub_sample_factor=4, bn_layer=True):
- super(_NonLocalBlockND, self).__init__()
-
- assert dimension in [1, 2, 3]
- assert mode in ['embedded_gaussian', 'gaussian', 'dot_product', 'concatenation', 'concat_proper', 'concat_proper_down']
-
- # print('Dimension: %d, mode: %s' % (dimension, mode))
-
- self.mode = mode
- self.dimension = dimension
- self.sub_sample_factor = sub_sample_factor if isinstance(sub_sample_factor, list) else [sub_sample_factor]
-
- self.in_channels = in_channels
- self.inter_channels = inter_channels
-
- if self.inter_channels is None:
- self.inter_channels = in_channels // 2
- if self.inter_channels == 0:
- self.inter_channels = 1
-
- if dimension == 3:
- conv_nd = nn.Conv3d
- max_pool = nn.MaxPool3d
- bn = nn.BatchNorm3d
- elif dimension == 2:
- conv_nd = nn.Conv2d
- max_pool = nn.MaxPool2d
- bn = nn.BatchNorm2d
- else:
- conv_nd = nn.Conv1d
- max_pool = nn.MaxPool1d
- bn = nn.BatchNorm1d
-
- self.g = conv_nd(in_channels=self.in_channels, out_channels=self.inter_channels,
- kernel_size=1, stride=1, padding=0)
-
- if bn_layer:
- self.W = nn.Sequential(
- conv_nd(in_channels=self.inter_channels, out_channels=self.in_channels,
- kernel_size=1, stride=1, padding=0),
- bn(self.in_channels)
- )
- nn.init.constant_(self.W[1].weight, 0)
- nn.init.constant_(self.W[1].bias, 0)
- else:
- self.W = conv_nd(in_channels=self.inter_channels, out_channels=self.in_channels,
- kernel_size=1, stride=1, padding=0)
- nn.init.constant_(self.W.weight, 0)
- nn.init.constant_(self.W.bias, 0)
-
- self.theta = None
- self.phi = None
-
- if mode in ['embedded_gaussian', 'dot_product', 'concatenation', 'concat_proper', 'concat_proper_down']:
- self.theta = conv_nd(in_channels=self.in_channels, out_channels=self.inter_channels,
- kernel_size=1, stride=1, padding=0)
- self.phi = conv_nd(in_channels=self.in_channels, out_channels=self.inter_channels,
- kernel_size=1, stride=1, padding=0)
-
- if mode in ['concatenation']:
- self.wf_phi = nn.Linear(self.inter_channels, 1, bias=False)
- self.wf_theta = nn.Linear(self.inter_channels, 1, bias=False)
- elif mode in ['concat_proper', 'concat_proper_down']:
- self.psi = nn.Conv2d(in_channels=self.inter_channels, out_channels=1, kernel_size=1, stride=1,
- padding=0, bias=True)
-
- if mode == 'embedded_gaussian':
- self.operation_function = self._embedded_gaussian
- elif mode == 'dot_product':
- self.operation_function = self._dot_product
- elif mode == 'gaussian':
- self.operation_function = self._gaussian
- elif mode == 'concatenation':
- self.operation_function = self._concatenation
- elif mode == 'concat_proper':
- self.operation_function = self._concatenation_proper
- elif mode == 'concat_proper_down':
- self.operation_function = self._concatenation_proper_down
- else:
- raise NotImplementedError('Unknown operation function.')
-
- if any(ss > 1 for ss in self.sub_sample_factor):
- self.g = nn.Sequential(self.g, max_pool(kernel_size=sub_sample_factor))
- if self.phi is None:
- self.phi = max_pool(kernel_size=sub_sample_factor)
- else:
- self.phi = nn.Sequential(self.phi, max_pool(kernel_size=sub_sample_factor))
- if mode == 'concat_proper_down':
- self.theta = nn.Sequential(self.theta, max_pool(kernel_size=sub_sample_factor))
-
- # Initialise weights
- for m in self.children():
- init_weights(m, init_type='kaiming')
-
- def forward(self, x):
- '''
- :param x: (b, c, t, h, w)
- :return:
- '''
-
- output = self.operation_function(x)
- return output
-
- def _embedded_gaussian(self, x):
- batch_size = x.size(0)
-
- # g=>(b, c, t, h, w)->(b, 0.5c, t, h, w)->(b, thw, 0.5c)
- g_x = self.g(x).view(batch_size, self.inter_channels, -1)
- g_x = g_x.permute(0, 2, 1)
-
- # theta=>(b, c, t, h, w)[->(b, 0.5c, t, h, w)]->(b, thw, 0.5c)
- # phi =>(b, c, t, h, w)[->(b, 0.5c, t, h, w)]->(b, 0.5c, thw)
- # f=>(b, thw, 0.5c)dot(b, 0.5c, twh) = (b, thw, thw)
- theta_x = self.theta(x).view(batch_size, self.inter_channels, -1)
- theta_x = theta_x.permute(0, 2, 1)
- phi_x = self.phi(x).view(batch_size, self.inter_channels, -1)
- f = torch.matmul(theta_x, phi_x)
- f_div_C = F.softmax(f, dim=-1)
-
- # (b, thw, thw)dot(b, thw, 0.5c) = (b, thw, 0.5c)->(b, 0.5c, t, h, w)->(b, c, t, h, w)
- y = torch.matmul(f_div_C, g_x)
- y = y.permute(0, 2, 1).contiguous()
- y = y.view(batch_size, self.inter_channels, *x.size()[2:])
- W_y = self.W(y)
- z = W_y + x
-
- return z
-
- def _gaussian(self, x):
- batch_size = x.size(0)
- g_x = self.g(x).view(batch_size, self.inter_channels, -1)
- g_x = g_x.permute(0, 2, 1)
-
- theta_x = x.view(batch_size, self.in_channels, -1)
- theta_x = theta_x.permute(0, 2, 1)
-
- if self.sub_sample_factor > 1:
- phi_x = self.phi(x).view(batch_size, self.in_channels, -1)
- else:
- phi_x = x.view(batch_size, self.in_channels, -1)
-
- f = torch.matmul(theta_x, phi_x)
- f_div_C = F.softmax(f, dim=-1)
-
- y = torch.matmul(f_div_C, g_x)
- y = y.permute(0, 2, 1).contiguous()
- y = y.view(batch_size, self.inter_channels, *x.size()[2:])
- W_y = self.W(y)
- z = W_y + x
-
- return z
-
- def _dot_product(self, x):
- batch_size = x.size(0)
-
- g_x = self.g(x).view(batch_size, self.inter_channels, -1)
- g_x = g_x.permute(0, 2, 1)
-
- theta_x = self.theta(x).view(batch_size, self.inter_channels, -1)
- theta_x = theta_x.permute(0, 2, 1)
- phi_x = self.phi(x).view(batch_size, self.inter_channels, -1)
- f = torch.matmul(theta_x, phi_x)
- N = f.size(-1)
- f_div_C = f / N
-
- y = torch.matmul(f_div_C, g_x)
- y = y.permute(0, 2, 1).contiguous()
- y = y.view(batch_size, self.inter_channels, *x.size()[2:])
- W_y = self.W(y)
- z = W_y + x
-
- return z
-
- def _concatenation(self, x):
- batch_size = x.size(0)
-
- # g=>(b, c, t, h, w)->(b, 0.5c, thw/s**2)
- g_x = self.g(x).view(batch_size, self.inter_channels, -1)
-
- # theta=>(b, c, t, h, w)[->(b, 0.5c, t, h, w)]->(b, thw, 0.5c)
- # phi =>(b, c, t, h, w)[->(b, 0.5c, t, h, w)]->(b, thw/s**2, 0.5c)
- theta_x = self.theta(x).view(batch_size, self.inter_channels, -1).permute(0, 2, 1)
- phi_x = self.phi(x).view(batch_size, self.inter_channels, -1).permute(0, 2, 1)
-
- # theta => (b, thw, 0.5c) -> (b, thw, 1) -> (b, 1, thw) -> (expand) (b, thw/s**2, thw)
- # phi => (b, thw/s**2, 0.5c) -> (b, thw/s**2, 1) -> (expand) (b, thw/s**2, thw)
- # f=> RELU[(b, thw/s**2, thw) + (b, thw/s**2, thw)] = (b, thw/s**2, thw)
- f = self.wf_theta(theta_x).permute(0, 2, 1).repeat(1, phi_x.size(1), 1) + \
- self.wf_phi(phi_x).repeat(1, 1, theta_x.size(1))
- f = F.relu(f, inplace=True)
-
- # Normalise the relations
- N = f.size(-1)
- f_div_c = f / N
-
- # g(x_j) * f(x_j, x_i)
- # (b, 0.5c, thw/s**2) * (b, thw/s**2, thw) -> (b, 0.5c, thw)
- y = torch.matmul(g_x, f_div_c)
- y = y.contiguous().view(batch_size, self.inter_channels, *x.size()[2:])
- W_y = self.W(y)
- z = W_y + x
-
- return z
-
- def _concatenation_proper(self, x):
- batch_size = x.size(0)
-
- # g=>(b, c, t, h, w)->(b, 0.5c, thw/s**2)
- g_x = self.g(x).view(batch_size, self.inter_channels, -1)
-
- # theta=>(b, c, t, h, w)[->(b, 0.5c, t, h, w)]->(b, 0.5c, thw)
- # phi =>(b, c, t, h, w)[->(b, 0.5c, t, h, w)]->(b, 0.5c, thw/s**2)
- theta_x = self.theta(x).view(batch_size, self.inter_channels, -1)
- phi_x = self.phi(x).view(batch_size, self.inter_channels, -1)
-
- # theta => (b, 0.5c, thw) -> (expand) (b, 0.5c, thw/s**2, thw)
- # phi => (b, 0.5c, thw/s**2) -> (expand) (b, 0.5c, thw/s**2, thw)
- # f=> RELU[(b, 0.5c, thw/s**2, thw) + (b, 0.5c, thw/s**2, thw)] = (b, 0.5c, thw/s**2, thw)
- f = theta_x.unsqueeze(dim=2).repeat(1,1,phi_x.size(2),1) + \
- phi_x.unsqueeze(dim=3).repeat(1,1,1,theta_x.size(2))
- f = F.relu(f, inplace=True)
-
- # psi -> W_psi^t * f -> (b, 1, thw/s**2, thw) -> (b, thw/s**2, thw)
- f = torch.squeeze(self.psi(f), dim=1)
-
- # Normalise the relations
- f_div_c = F.softmax(f, dim=1)
-
- # g(x_j) * f(x_j, x_i)
- # (b, 0.5c, thw/s**2) * (b, thw/s**2, thw) -> (b, 0.5c, thw)
- y = torch.matmul(g_x, f_div_c)
- y = y.contiguous().view(batch_size, self.inter_channels, *x.size()[2:])
- W_y = self.W(y)
- z = W_y + x
-
- return z
-
- def _concatenation_proper_down(self, x):
- batch_size = x.size(0)
-
- # g=>(b, c, t, h, w)->(b, 0.5c, thw/s**2)
- g_x = self.g(x).view(batch_size, self.inter_channels, -1)
-
- # theta=>(b, c, t, h, w)[->(b, 0.5c, t, h, w)]->(b, 0.5c, thw)
- # phi =>(b, c, t, h, w)[->(b, 0.5c, t, h, w)]->(b, 0.5c, thw/s**2)
- theta_x = self.theta(x)
- downsampled_size = theta_x.size()
- theta_x = theta_x.view(batch_size, self.inter_channels, -1)
- phi_x = self.phi(x).view(batch_size, self.inter_channels, -1)
-
- # theta => (b, 0.5c, thw) -> (expand) (b, 0.5c, thw/s**2, thw)
- # phi => (b, 0.5, thw/s**2) -> (expand) (b, 0.5c, thw/s**2, thw)
- # f=> RELU[(b, 0.5c, thw/s**2, thw) + (b, 0.5c, thw/s**2, thw)] = (b, 0.5c, thw/s**2, thw)
- f = theta_x.unsqueeze(dim=2).repeat(1,1,phi_x.size(2),1) + \
- phi_x.unsqueeze(dim=3).repeat(1,1,1,theta_x.size(2))
- f = F.relu(f, inplace=True)
-
- # psi -> W_psi^t * f -> (b, 0.5c, thw/s**2, thw) -> (b, 1, thw/s**2, thw) -> (b, thw/s**2, thw)
- f = torch.squeeze(self.psi(f), dim=1)
-
- # Normalise the relations
- f_div_c = F.softmax(f, dim=1)
-
- # g(x_j) * f(x_j, x_i)
- # (b, 0.5c, thw/s**2) * (b, thw/s**2, thw) -> (b, 0.5c, thw)
- y = torch.matmul(g_x, f_div_c)
- y = y.contiguous().view(batch_size, self.inter_channels, *downsampled_size[2:])
-
- # upsample the final featuremaps # (b,0.5c,t/s1,h/s2,w/s3)
- y = F.interpolate(y, size=x.size()[2:], mode='trilinear')
-
- # attention block output
- W_y = self.W(y)
- z = W_y + x
-
- return z
-
-
-class NONLocalBlock2D(_NonLocalBlockND):
- def __init__(self, in_channels, inter_channels=None, mode='embedded_gaussian', sub_sample_factor=2, bn_layer=True):
- super(NONLocalBlock2D, self).__init__(in_channels,
- inter_channels=inter_channels,
- dimension=2, mode=mode,
- sub_sample_factor=sub_sample_factor,
- bn_layer=bn_layer)
-
-## 5, scale attention
-class BasicConv(nn.Module):
- def __init__(self, in_planes, out_planes, kernel_size, stride=1, padding=0, dilation=1, groups=1,
- relu=True, bn=True, bias=False):
- super(BasicConv, self).__init__()
- self.out_channels = out_planes
- self.conv = nn.Conv2d(in_planes, out_planes, kernel_size=kernel_size, stride=stride, padding=padding,
- dilation=dilation, groups=groups, bias=bias)
- self.bn = nn.BatchNorm2d(out_planes, eps=1e-5, momentum=0.01, affine=True) if bn else None
- self.relu = nn.ReLU() if relu else None
-
- def forward(self, x):
- x = self.conv(x)
- if self.bn is not None:
- x = self.bn(x)
- if self.relu is not None:
- x = self.relu(x)
- return x
-
-
-class Flatten(nn.Module):
- def forward(self, x):
- return x.view(x.size(0), -1)
-
-
-class ChannelGate(nn.Module):
- def __init__(self, gate_channels, reduction_ratio=16, pool_types=['avg', 'max']):
- super(ChannelGate, self).__init__()
- self.gate_channels = gate_channels
- self.mlp = nn.Sequential(
- Flatten(),
- nn.Linear(gate_channels, gate_channels // reduction_ratio),
- nn.ReLU(),
- nn.Linear(gate_channels // reduction_ratio, gate_channels)
- )
- self.pool_types = pool_types
-
- def forward(self, x):
- channel_att_sum = None
- for pool_type in self.pool_types:
- if pool_type == 'avg':
- avg_pool = F.avg_pool2d(x, (x.size(2), x.size(3)), stride=(x.size(2), x.size(3)))
- channel_att_raw = self.mlp(avg_pool)
- elif pool_type == 'max':
- max_pool = F.max_pool2d(x, (x.size(2), x.size(3)), stride=(x.size(2), x.size(3)))
- channel_att_raw = self.mlp(max_pool)
- elif pool_type == 'lp':
- lp_pool = F.lp_pool2d(x, 2, (x.size(2), x.size(3)), stride=(x.size(2), x.size(3)))
- channel_att_raw = self.mlp(lp_pool)
- elif pool_type == 'lse':
- # LSE pool only
- lse_pool = logsumexp_2d(x)
- channel_att_raw = self.mlp(lse_pool)
-
- if channel_att_sum is None:
- channel_att_sum = channel_att_raw
- else:
- channel_att_sum = channel_att_sum + channel_att_raw
-
- # scalecoe = F.sigmoid(channel_att_sum)
- channel_att_sum = channel_att_sum.reshape(channel_att_sum.shape[0], 4, 4)
- avg_weight = torch.mean(channel_att_sum, dim=2).unsqueeze(2)
- avg_weight = avg_weight.expand(channel_att_sum.shape[0], 4, 4).reshape(channel_att_sum.shape[0], 16)
- scale = torch.sigmoid(avg_weight).unsqueeze(2).unsqueeze(3).expand_as(x)
-
- return x * scale, scale
-
-
-def logsumexp_2d(tensor):
- tensor_flatten = tensor.view(tensor.size(0), tensor.size(1), -1)
- s, _ = torch.max(tensor_flatten, dim=2, keepdim=True)
- outputs = s + (tensor_flatten - s).exp().sum(dim=2, keepdim=True).log()
- return outputs
-
-
-class ChannelPool(nn.Module):
- def forward(self, x):
- return torch.cat((torch.max(x, 1)[0].unsqueeze(1), torch.mean(x, 1).unsqueeze(1)), dim=1)
-
-
-class SpatialGate(nn.Module):
- def __init__(self):
- super(SpatialGate, self).__init__()
- kernel_size = 7
- self.compress = ChannelPool()
- self.spatial = BasicConv(2, 1, kernel_size, stride=1, padding=(kernel_size-1) // 2, relu=False)
-
- def forward(self, x):
- x_compress = self.compress(x)
- x_out = self.spatial(x_compress)
- scale = torch.sigmoid(x_out) # broadcasting
- # spa_scale = scale.expand_as(x)
- # print(spa_scale.shape)
- return x * scale, scale
-
-class SpatialAtten(nn.Module):
- def __init__(self, in_size, out_size, kernel_size=3, stride=1):
- super(SpatialAtten, self).__init__()
- self.conv1 = BasicConv(in_size, out_size, kernel_size, stride=stride,
- padding=(kernel_size-1) // 2, relu=True)
- self.conv2 = BasicConv(out_size, out_size, kernel_size=1, stride=stride,
- padding=0, relu=True, bn=False)
-
- def forward(self, x):
- residual = x
- x_out = self.conv1(x)
- x_out = self.conv2(x_out)
- spatial_att = torch.sigmoid(x_out).unsqueeze(4).permute(0, 1, 4, 2, 3)
- spatial_att = spatial_att.expand(spatial_att.shape[0], 4, 4, spatial_att.shape[3], spatial_att.shape[4]).reshape(
- spatial_att.shape[0], 16, spatial_att.shape[3], spatial_att.shape[4])
- x_out = residual * spatial_att
-
- x_out += residual
-
- return x_out, spatial_att
-
-class Scale_atten_block(nn.Module):
- def __init__(self, gate_channels, reduction_ratio=16, pool_types=['avg', 'max'], no_spatial=False):
- super(Scale_atten_block, self).__init__()
- self.ChannelGate = ChannelGate(gate_channels, reduction_ratio, pool_types)
- self.no_spatial = no_spatial
- if not no_spatial:
- self.SpatialGate = SpatialAtten(gate_channels, gate_channels //reduction_ratio)
-
- def forward(self, x):
- x_out, ca_atten = self.ChannelGate(x)
- if not self.no_spatial:
- x_out, sa_atten = self.SpatialGate(x_out)
-
- return x_out, ca_atten, sa_atten
-
-
-class scale_atten_convblock(nn.Module):
- def __init__(self, in_size, out_size, stride=1, downsample=None, use_cbam=True, no_spatial=False, drop_out=False):
- super(scale_atten_convblock, self).__init__()
- # if stride != 1 or in_size != out_size:
- # downsample = nn.Sequential(
- # nn.Conv2d(in_size, out_size,
- # kernel_size=1, stride=stride, bias=False),
- # nn.BatchNorm2d(out_size),
- # )
- self.downsample = downsample
- self.stride = stride
- self.no_spatial = no_spatial
- self.dropout = drop_out
-
- self.relu = nn.ReLU(inplace=True)
- self.conv3 = conv3x3(in_size, out_size)
- self.bn3 = nn.BatchNorm2d(out_size)
-
- if use_cbam:
- self.cbam = Scale_atten_block(in_size, reduction_ratio=4, no_spatial=self.no_spatial) # out_size
- else:
- self.cbam = None
-
- def forward(self, x):
- residual = x
-
- if self.downsample is not None:
- residual = self.downsample(x)
-
- if not self.cbam is None:
- out, scale_c_atten, scale_s_atten = self.cbam(x)
-
- # scale_c_atten = nn.Sigmoid()(scale_c_atten)
- # scale_s_atten = nn.Sigmoid()(scale_s_atten)
- # scale_atten = channel_atten_c * spatial_atten_s
-
- # scale_max = torch.argmax(scale_atten, dim=1, keepdim=True)
- # scale_max_soft = get_soft_label(input_tensor=scale_max, num_class=8)
- # scale_max_soft = scale_max_soft.permute(0, 3, 1, 2)
- # scale_atten_soft = scale_atten * scale_max_soft
-
- out += residual
- out = self.relu(out)
- out = self.conv3(out)
- out = self.bn3(out)
- out = self.relu(out)
-
- if self.dropout:
- out = nn.Dropout2d(0.5)(out)
-
- return out
-
-## 6, CANet
-class CANet(nn.Module):
- """
- Implementation of CANet (Comprehensive Attention Network) for 2D image segmentation.
-
- * Reference: R. Gu et al. `CA-Net: Comprehensive Attention Convolutional Neural Networks
- for Explainable Medical Image Segmentation `_.
- IEEE Transactions on Medical Imaging, 40(2),2021:699-711.
-
- Parameters are given in the `params` dictionary, and should include the
- following fields:
-
- :param in_chns: (int) Input channel number.
- :param feature_chns: (list) Feature channel for each resolution level.
- The length should be 5, such as [16, 32, 64, 128, 256].
- :param class_num: (int) The class number for segmentation task.
- :param is_deconv: (bool) Using deconvolution for up-sampling or not.
- If False, bilinear interpolation will be used for up-sampling. Default is True.
- :param is_batchnorm: (bool) If batch normalization is or not. Default is True.
- :param feature_scale: (int) The scale of resolution levels. Default is 4.
- """
- def __init__(self, params): #args, in_ch=3, n_classes=2, feature_scale=4, is_deconv=True, is_batchnorm=True,
- # nonlocal_mode='concatenation', attention_dsample=(1, 1)):
- super(CANet, self).__init__()
- self.in_channels = params['in_chns']
- self.num_classes = params['class_num']
- self.feature_chns= params.get('feature_chns', [32, 64, 128, 256, 512])
- self.is_deconv = params.get('is_deconv', True)
- self.is_batchnorm = params.get('is_batchnorm', True)
- self.feature_scale = params.get('feature_scale', 4)
- nonlocal_mode = 'concatenation'
- attention_dsample = (1, 1)
-
- filters = self.feature_chns
- filters = [int(x / self.feature_scale) for x in filters]
-
- # downsampling
- self.conv1 = conv_block(self.in_channels, filters[0])
- self.maxpool1 = nn.MaxPool2d(kernel_size=(2, 2))
-
- self.conv2 = conv_block(filters[0], filters[1])
- self.maxpool2 = nn.MaxPool2d(kernel_size=(2, 2))
-
- self.conv3 = conv_block(filters[1], filters[2])
- self.maxpool3 = nn.MaxPool2d(kernel_size=(2, 2))
-
- self.conv4 = conv_block(filters[2], filters[3], drop_out=True)
- self.maxpool4 = nn.MaxPool2d(kernel_size=(2, 2))
-
- self.center = conv_block(filters[3], filters[4], drop_out=True)
-
- # attention blocks
- # self.attentionblock1 = GridAttentionBlock2D(in_channels=filters[0], gating_channels=filters[1],
- # inter_channels=filters[0])
- self.attentionblock2 = MultiAttentionBlock(in_size=filters[1], gate_size=filters[2], inter_size=filters[1],
- nonlocal_mode=nonlocal_mode, sub_sample_factor=attention_dsample)
- self.attentionblock3 = MultiAttentionBlock(in_size=filters[2], gate_size=filters[3], inter_size=filters[2],
- nonlocal_mode=nonlocal_mode, sub_sample_factor=attention_dsample)
- self.nonlocal4_2 = NONLocalBlock2D(in_channels=filters[4], inter_channels=filters[4] // 4)
-
- # upsampling
- self.up_concat4 = UpCat(filters[4], filters[3], self.is_deconv)
- self.up_concat3 = UpCat(filters[3], filters[2], self.is_deconv)
- self.up_concat2 = UpCat(filters[2], filters[1], self.is_deconv)
- self.up_concat1 = UpCat(filters[1], filters[0], self.is_deconv)
- self.up4 = SE_Conv_Block(filters[4], filters[3], drop_out=True)
- self.up3 = SE_Conv_Block(filters[3], filters[2])
- self.up2 = SE_Conv_Block(filters[2], filters[1])
- self.up1 = SE_Conv_Block(filters[1], filters[0])
-
- # For deep supervision, project the multi-scale feature maps to the same number of channels
- self.dsv1 = nn.Conv2d(in_channels=filters[0], out_channels=filters[0]//2, kernel_size=1)
- self.dsv2 = nn.Conv2d(in_channels=filters[1], out_channels=filters[0]//2, kernel_size=1)
- self.dsv3 = nn.Conv2d(in_channels=filters[2], out_channels=filters[0]//2, kernel_size=1)
- self.dsv4 = nn.Conv2d(in_channels=filters[3], out_channels=filters[0]//2, kernel_size=1)
-
- self.scale_att = scale_atten_convblock(in_size=filters[0]//2 * 4, out_size=filters[0])
- self.final = nn.Conv2d(filters[0], self.num_classes, kernel_size=1)
-
- def forward(self, inputs):
- x_shape = list(inputs.shape)
- if(len(x_shape) == 5):
- [N, C, D, H, W] = x_shape
- new_shape = [N*D, C, H, W]
- inputs = torch.transpose(inputs, 1, 2)
- inputs = torch.reshape(inputs, new_shape)
-
- # Feature Extraction
- conv1 = self.conv1(inputs)
- maxpool1 = self.maxpool1(conv1)
-
- conv2 = self.conv2(maxpool1)
- maxpool2 = self.maxpool2(conv2)
-
- conv3 = self.conv3(maxpool2)
- maxpool3 = self.maxpool3(conv3)
-
- conv4 = self.conv4(maxpool3)
- maxpool4 = self.maxpool4(conv4)
-
- # Gating Signal Generation
- center = self.center(maxpool4)
-
- # Attention Mechanism
- # Upscaling Part (Decoder)
- up4 = self.up_concat4(conv4, center)
- g_conv4 = self.nonlocal4_2(up4)
-
- up4, att_weight4 = self.up4(g_conv4)
- g_conv3, att3 = self.attentionblock3(conv3, up4)
-
- # atten3_map = att3.cpu().detach().numpy().astype(np.float)
- # atten3_map = ndimage.interpolation.zoom(atten3_map, [1.0, 1.0, 224 / atten3_map.shape[2],
- # 300 / atten3_map.shape[3]], order=0)
-
- up3 = self.up_concat3(g_conv3, up4)
- up3, att_weight3 = self.up3(up3)
- g_conv2, att2 = self.attentionblock2(conv2, up3)
-
- up2 = self.up_concat2(g_conv2, up3)
- up2, att_weight2 = self.up2(up2)
-
- up1 = self.up_concat1(conv1, up2)
- up1, att_weight1 = self.up1(up1)
-
- # Deep Supervision
- dsv1 = self.dsv1(up1)
- dsv2 = F.interpolate(self.dsv2(up2), dsv1.shape[2:], mode = 'bilinear')
- dsv3 = F.interpolate(self.dsv3(up3), dsv1.shape[2:], mode = 'bilinear')
- dsv4 = F.interpolate(self.dsv4(up4), dsv1.shape[2:], mode = 'bilinear')
-
- dsv_cat = torch.cat([dsv1, dsv2, dsv3, dsv4], dim=1)
- out = self.scale_att(dsv_cat)
-
- out = self.final(out)
- if(len(x_shape) == 5):
- if(isinstance(out, (list,tuple))):
- for i in range(len(out)):
- new_shape = [N, D] + list(out[i].shape)[1:]
- out[i] = torch.transpose(torch.reshape(out[i], new_shape), 1, 2)
- else:
- new_shape = [N, D] + list(out.shape)[1:]
- out = torch.transpose(torch.reshape(out, new_shape), 1, 2)
-
- return out
-
-if __name__ == "__main__":
- params = {'in_chns':3,
- 'class_num':2}
- Net = CANet(params)
- Net = Net.double()
-
- x = np.random.rand(4, 3, 224, 224)
- xt = torch.from_numpy(x)
- xt = xt.clone().detach()
-
- y = Net(xt)
- print(len(y.size()))
- y = y.detach().numpy()
- print(y.shape)
diff --git a/pymic/net/cnn/unet_attention.py b/pymic/net/cnn/unet_attention.py
deleted file mode 100644
index 7f0b311..0000000
--- a/pymic/net/cnn/unet_attention.py
+++ /dev/null
@@ -1,115 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-
-import torch
-import torch.nn as nn
-from pymic.net.cnn.basic_layer import *
-from pymic.net.cnn.unet import *
-
-class AttentionGateBlock(nn.Module):
- def __init__(self, dim, chns_l, chns_h):
- """
- chns_l: channel number of low-level features from the encoder
- chns_h: channel number of high-level features from the decoder
- """
- super(AttentionGateBlock, self).__init__()
- assert dim == 2 or dim == 3
- self.dim = dim
- self.in_chns_l = chns_l
- self.in_chns_h = chns_h
-
- conv_nd = get_conv_class(self.dim)
- self.out_chns = int(min(self.in_chns_l, self.in_chns_h)/2)
- self.conv1_l = conv_nd(self.in_chns_l, self.out_chns,
- kernel_size = 1, bias = True)
- self.conv1_h = conv_nd(self.in_chns_h, self.out_chns,
- kernel_size = 1, bias = True)
- self.conv2 = conv_nd(self.out_chns, 1,
- kernel_size = 1, bias = True)
- self.act1 = nn.ReLU()
- self.act2 = nn.Sigmoid()
-
- def forward(self, x_l, x_h):
- input_shape = list(x_l.shape)
- gate_shape = list(x_h.shape)
-
- # resize low-level feature to the shape of high-level feature
- mode = 'bilinear' if self.dim == 2 else 'trilinear'
- x_l_reshape = nn.functional.interpolate(x_l, size = gate_shape[2:], mode = mode)
- f_l = self.conv1_l(x_l_reshape)
- f_h = self.conv1_h(x_h)
- f = f_l + f_h
- f = self.act1(f)
- f = self.conv2(f)
- att = self.act2(f)
- # resize attention map to the shape of low-level feature
- att = nn.functional.interpolate(att, size = input_shape[2:], mode = mode)
- # return calibrated low-level feature
- output = att * x_l
- return output
-
-
-class UpBlockWithAttention(UpBlock):
- """Upsampling followed by ConvBlock"""
- def __init__(self, dim, in_channels1, in_channels2, out_channels, dropout_p, up_mode = 2,
- kernel_size = 3, padding = 1, stride = 1, dilation = 1, norm_type = 'batch_norm'):
- """
- in_channels1: channel of high-level features
- in_channels2: channel of low-level features
- out_channels: output channel number
- dropout_p: probability of dropout
- """
- super(UpBlockWithAttention, self).__init__(dim, in_channels1, in_channels2, out_channels, dropout_p,
- up_mode, kernel_size, padding, stride, dilation, norm_type)
- self.ag = AttentionGateBlock(dim, in_channels2, in_channels1)
-
- def forward(self, x1, x2):
- x2at = self.ag(x2, x1)
- if self.up_mode != "transconv":
- x1 = self.conv1x1(x1)
- x1 = self.up(x1)
- x = torch.cat([x2at, x1], dim=1)
- return self.conv(x)
-
-class DecoderWithAttention(Decoder):
- """
- Decoder of 2D UNet.
-
- Parameters are given in the `params` dictionary, and should include the
- following fields:
-
- :param in_chns: (int) Input channel number.
- :param feature_chns: (list) Feature channel for each resolution level.
- The length should be 4 or 5, such as [16, 32, 64, 128, 256].
- :param dropout: (list) The dropout ratio for each resolution level.
- The length should be the same as that of `feature_chns`.
- :param class_num: (int) The class number for segmentation task.
- :param up_mode: (string or int) The mode for upsampling. The allowed values are:
- 0 (or `TransConv`), 1 (or `Nearest`), 2 (or `Bilinear`), 3 (or `Bicubic`).
- The default value is 2 (or `Bilinear`).
- :param multiscale_pred: (bool) Get multi-scale prediction.
- """
- def __init__(self, params):
- super(DecoderWithAttention, self).__init__(params)
- self.up1 = UpBlockWithAttention(self.dim, self.ft_chns[4], self.ft_chns[3], self.ft_chns[3], self.dropout[3],
- self.up_mode, norm_type = self.norm_type)
- self.up2 = UpBlockWithAttention(self.dim, self.ft_chns[3], self.ft_chns[2], self.ft_chns[2], self.dropout[2],
- self.up_mode, norm_type = self.norm_type)
- self.up3 = UpBlockWithAttention(self.dim, self.ft_chns[2], self.ft_chns[1], self.ft_chns[1], self.dropout[1],
- self.up_mode, norm_type = self.norm_type)
- self.up4 = UpBlockWithAttention(self.dim, self.ft_chns[1], self.ft_chns[0], self.ft_chns[0], self.dropout[0],
- self.up_mode, norm_type = self.norm_type)
-
-
-class AttentionUNet(UNet):
- """
- A Reimplementation of the attention U-Net paper:
- Ozan Oktay, Jo Schlemper et al.:
- Attentin U-Net: Looking Where to Look for the Pancreas. MIDL, 2018.
-
- Note that there are some modifications from the original paper, such as
- the use of batch normalization, dropout, and leaky relu here.
- """
- def __init__(self, params):
- super(AttentionUNet, self).__init__(params)
- self.decoder = DecoderWithAttention(params)
\ No newline at end of file
diff --git a/pymic/net/cnn/unet_pp.py b/pymic/net/cnn/unet_pp.py
deleted file mode 100644
index f3df6e3..0000000
--- a/pymic/net/cnn/unet_pp.py
+++ /dev/null
@@ -1,128 +0,0 @@
-# -*- coding: utf-8 -*-
-import torch
-import torch.nn as nn
-from pymic.net.cnn.unet import *
-
-class UNetpp(nn.Module):
- """
- An implementation of the U-Net++.
-
- * Reference: Zongwei Zhou, et al.: `UNet++: A Nested U-Net Architecture for Medical Image Segmentation.
- `_
- MICCAI DLMIA workshop, 2018: 3-11.
-
- Note that there are some modifications from the original paper, such as
- the use of dropout and leaky relu here.
-
- Parameters are given in the `params` dictionary, and should include the
- following fields:
-
- :param in_chns: (int) Input channel number.
- :param feature_chns: (list) Feature channel for each resolution level.
- The length should be 4 or 5, such as [16, 32, 64, 128, 256].
- :param dropout: (list) The dropout ratio for each resolution level.
- The length should be the same as that of `feature_chns`.
- :param class_num: (int) The class number for segmentation task.
- """
- def __init__(self, params):
- super(UNetpp, self).__init__()
- params = self.get_default_parameters(params)
- self.params = params
- self.dim = params['dimension']
- self.in_chns = params['in_chns']
- self.filters = params['feature_chns']
- self.dropout = params['dropout']
- self.n_class = params['class_num']
-
- maxpool_nd = get_maxpool_class(self.dim)
- up_mode = 'bilinear' if self.dim == 2 else 'trilinear'
- self.pool = maxpool_nd(kernel_size=2, stride=2)
- self.Up = nn.Upsample(scale_factor=2, mode=up_mode, align_corners=True)
-
- self.conv0_0 = ConvBlock(self.dim, self.in_chns, self.filters[0], self.dropout[0])
- self.conv1_0 = ConvBlock(self.dim, self.filters[0], self.filters[1], self.dropout[1])
- self.conv2_0 = ConvBlock(self.dim, self.filters[1], self.filters[2], self.dropout[2])
- self.conv3_0 = ConvBlock(self.dim, self.filters[2], self.filters[3], self.dropout[3])
- self.conv4_0 = ConvBlock(self.dim, self.filters[3], self.filters[4], self.dropout[4])
-
- self.conv0_1 = ConvBlock(self.dim, self.filters[0] + self.filters[1], self.filters[0], 0)
- self.conv1_1 = ConvBlock(self.dim, self.filters[1] + self.filters[2], self.filters[1], 0)
- self.conv2_1 = ConvBlock(self.dim, self.filters[2] + self.filters[3], self.filters[2], 0)
- self.conv3_1 = ConvBlock(self.dim, self.filters[3] + self.filters[4], self.filters[3], 0)
-
- self.conv0_2 = ConvBlock(self.dim, self.filters[0] * 2 + self.filters[1], self.filters[0], 0)
- self.conv1_2 = ConvBlock(self.dim, self.filters[1] * 2 + self.filters[2], self.filters[1], 0)
- self.conv2_2 = ConvBlock(self.dim, self.filters[2] * 2 + self.filters[3], self.filters[2], 0)
-
- self.conv0_3 = ConvBlock(self.dim, self.filters[0] * 3 + self.filters[1], self.filters[0], 0)
- self.conv1_3 = ConvBlock(self.dim, self.filters[1] * 3 + self.filters[2], self.filters[1], 0)
-
- self.conv0_4 = ConvBlock(self.dim, self.filters[0] * 4 + self.filters[1], self.filters[0], 0)
-
- conv_nd = get_conv_class(self.dim)
- self.final = conv_nd(self.filters[0], self.n_class, kernel_size=1)
-
- def get_default_parameters(self, params):
- default_param = {
- 'dimension': 2,
- 'feature_chns': [32, 64, 128, 256, 512],
- 'dropout': [0.0, 0.0, 0.2, 0.3, 0.4],
- 'up_mode': 2,
- 'norm_type': 'batch_norm'
- }
- for key in default_param:
- params[key] = params.get(key, default_param[key])
- for key in params:
- logging.info("{0:} = {1:}".format(key, params[key]))
- return params
-
- def forward(self, x):
- x_shape = list(x.shape)
- if(len(x_shape) == 5 and self.dim == 2):
- [N, C, D, H, W] = x_shape
- new_shape = [N*D, C, H, W]
- x = torch.transpose(x, 1, 2)
- x = torch.reshape(x, new_shape)
- x0_0 = self.conv0_0(x)
- x1_0 = self.conv1_0(self.pool(x0_0))
- x0_1 = self.conv0_1(torch.cat([x0_0, self.Up(x1_0)], 1))
-
- x2_0 = self.conv2_0(self.pool(x1_0))
- x1_1 = self.conv1_1(torch.cat([x1_0, self.Up(x2_0)], 1))
- x0_2 = self.conv0_2(torch.cat([x0_0, x0_1, self.Up(x1_1)], 1))
-
- x3_0 = self.conv3_0(self.pool(x2_0))
- x2_1 = self.conv2_1(torch.cat([x2_0, self.Up(x3_0)], 1))
- x1_2 = self.conv1_2(torch.cat([x1_0, x1_1, self.Up(x2_1)], 1))
- x0_3 = self.conv0_3(torch.cat([x0_0, x0_1, x0_2, self.Up(x1_2)], 1))
-
- x4_0 = self.conv4_0(self.pool(x3_0))
- x3_1 = self.conv3_1(torch.cat([x3_0, self.Up(x4_0)], 1))
- x2_2 = self.conv2_2(torch.cat([x2_0, x2_1, self.Up(x3_1)], 1))
- x1_3 = self.conv1_3(torch.cat([x1_0, x1_1, x1_2, self.Up(x2_2)], 1))
- x0_4 = self.conv0_4(torch.cat([x0_0, x0_1, x0_2, x0_3, self.Up(x1_3)], 1))
-
- output = self.final(x0_4)
- if(len(x_shape) == 5 and self.dim == 2):
- new_shape = [N, D] + list(output.shape)[1:]
- output = torch.reshape(output, new_shape)
- output = torch.transpose(output, 1, 2)
- return output
-
-
-if __name__ == "__main__":
- params = {'in_chns':4,
- 'feature_chns':[2, 8, 32, 48, 64],
- 'dropout': [0, 0, 0.3, 0.4, 0.5],
- 'class_num': 2}
- Net = UNetpp(params)
- Net = Net.double()
-
- x = np.random.rand(4, 4, 10, 96, 96)
- xt = torch.from_numpy(x)
- xt = torch.tensor(xt)
-
- y = Net(xt)
- print(len(y.size()))
- y = y.detach().numpy()
- print(y.shape)
diff --git a/pymic/net/cnn/unet_scse.py b/pymic/net/cnn/unet_scse.py
deleted file mode 100644
index 28ba716..0000000
--- a/pymic/net/cnn/unet_scse.py
+++ /dev/null
@@ -1,220 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-
-import torch
-import torch.nn as nn
-import numpy as np
-from pymic.net.cnn.basic_layer import get_conv_class
-from pymic.net.cnn.unet import ConvBlock, DownBlock, UpBlock, Encoder, Decoder, UNet
-from pymic.net.net2d.scse2d import *
-
-
-class ChannelSELayer(nn.Module):
- """
- Re-implementation of Squeeze-and-Excitation (SE) block.
-
- * Reference: Jie Hu, Li Shen, Gang Sun: Squeeze-and-Excitation Networks.
- `CVPR 2018. `_
-
- :param num_channels: Number of input channels
- :param reduction_ratio: By how much should the num_channels should be reduced.
- """
- def __init__(self, dim, num_channels, reduction_ratio=2):
- super(ChannelSELayer, self).__init__()
- num_channels_reduced = num_channels // reduction_ratio
- self.reduction_ratio = reduction_ratio
- self.fc1 = nn.Linear(num_channels, num_channels_reduced, bias=True)
- self.fc2 = nn.Linear(num_channels_reduced, num_channels, bias=True)
- self.relu = nn.ReLU()
- self.sigmoid = nn.Sigmoid()
- self.dim = dim
-
- def forward(self, input_tensor):
- """
- :param input_tensor: X, shape = (batch_size, num_channels, H, W)
- :return: output tensor
- """
-
- batch_size, num_channels = list(input_tensor.size())[:2]
- # Average along each channel
- squeeze_tensor = input_tensor.view(batch_size, num_channels, -1).mean(dim=2)
- # channel excitation
- fc_out_1 = self.relu(self.fc1(squeeze_tensor))
- fc_out_2 = self.sigmoid(self.fc2(fc_out_1))
-
- a, b = squeeze_tensor.size()
- if(self.dim == 2):
- output_tensor = torch.mul(input_tensor, fc_out_2.view(a, b, 1, 1))
- else:
- output_tensor = torch.mul(input_tensor, fc_out_2.view(a, b, 1, 1, 1))
-
- return output_tensor
-
-class SpatialSELayer(nn.Module):
- """
- Re-implementation of SE block -- squeezing spatially and exciting channel-wise.
-
- * Reference: Roy et al., Concurrent Spatial and Channel Squeeze & Excitation in
- Fully Convolutional Networks, MICCAI 2018.
-
- :param num_channels: Number of input channels.
- """
- def __init__(self, dim, num_channels):
- super(SpatialSELayer, self).__init__()
- self.dim = dim
- conv_nd = get_conv_class(dim)
- self.conv = conv_nd(num_channels, 1, 1)
- self.sigmoid = nn.Sigmoid()
-
- def forward(self, input_tensor, weights=None):
- """
- :param weights: weights for few shot learning
- :param input_tensor: X, shape = (batch_size, num_channels, H, W)
- :return: output_tensor
- """
- # spatial squeeze
- if(self.dim == 2):
- batch_size, channel, H, W = input_tensor.size()
- else:
- batch_size, channel, D, H, W = input_tensor.size()
- if weights is not None:
- weights = torch.mean(weights, dim=0)
- weights = weights.view(1, channel, 1, 1)
- if(self.dim == 2):
- out = F.conv2d(input_tensor, weights)
- else:
- out = F.conv3d(input_tensor, weights)
- else:
- out = self.conv(input_tensor)
- squeeze_tensor = self.sigmoid(out)
-
- # spatial excitation
- # print(input_tensor.size(), squeeze_tensor.size())
- if(self.dim == 2):
- squeeze_tensor = squeeze_tensor.view(batch_size, 1, H, W)
- else:
- squeeze_tensor = squeeze_tensor.view(batch_size, 1, D, H, W)
- output_tensor = torch.mul(input_tensor, squeeze_tensor)
- return output_tensor
-
-class ChannelSpatialSELayer(nn.Module):
- """
- Re-implementation of concurrent spatial and channel squeeze & excitation.
-
- * Reference: Roy et al., Concurrent Spatial and Channel Squeeze & Excitation in
- Fully Convolutional Networks, MICCAI 2018.
-
- :param num_channels: Number of input channels.
- :param reduction_ratio: By how much should the num_channels should be reduced.
- """
- def __init__(self, dim, num_channels, reduction_ratio=2):
- super(ChannelSpatialSELayer, self).__init__()
- self.cSE = ChannelSELayer(dim, num_channels, reduction_ratio)
- self.sSE = SpatialSELayer(dim, num_channels)
-
- def forward(self, input_tensor):
- """
- :param input_tensor: X, shape = (batch_size, num_channels, H, W)
- :return: output_tensor
- """
- output_tensor = torch.max(self.cSE(input_tensor), self.sSE(input_tensor))
- return output_tensor
-
-
-class ConvScSEBlock(ConvBlock):
- """
- Two convolutional blocks followed by `ChannelSpatialSELayer`.
- Each block consists of `Conv2d` + `BatchNorm2d` + `LeakyReLU`.
- A dropout layer is used between the wo blocks.
-
- :param in_channels: (int) Input channel number.
- :param out_channels: (int) Output channel number.
- :param dropout_p: (int) Dropout probability.
- """
- def __init__(self, dim, in_channels, out_channels, dropout_p, kernel_size = 3, padding = 1,
- stride = 1, dilation = 1, norm_type = 'batch_norm'):
- super(ConvScSEBlock, self).__init__(dim, in_channels, out_channels, dropout_p, kernel_size, padding,
- stride, dilation, norm_type)
-
- self.scse = ChannelSpatialSELayer(dim, out_channels)
-
- def forward(self, x):
- x = self.conv_conv(x)
- x = self.scse(x)
- return x
-
-class DownScSEBlock(DownBlock):
- """Downsampling followed by `ConvScSEBlock`.
-
- :param in_channels: (int) Input channel number.
- :param out_channels: (int) Output channel number.
- :param dropout_p: (int) Dropout probability.
- """
- def __init__(self, dim, in_channels, out_channels, dropout_p):
- super(DownScSEBlock, self).__init__(dim, in_channels, out_channels, dropout_p)
- self.scse = ChannelSpatialSELayer(dim, out_channels)
-
- def forward(self, x):
- x = self.maxpool_conv(x)
- x = self.scse(x)
- return x
-
-class UpScSEBlock(UpBlock):
- """Up-sampling followed by `ConvScSEBlock` in U-Net structure.
-
- The parameters for the backbone should be given in the `params` dictionary.
- See :mod:`pymic.net.net2d.unet2d.UpBlock` for details.
- """
- def __init__(self, dim, in_channels1, in_channels2, out_channels, dropout_p, up_mode = 2,
- kernel_size = 3, padding = 1, stride = 1, dilation = 1, norm_type = 'batch_norm'):
- super(UpScSEBlock, self).__init__(dim, in_channels1, in_channels2, out_channels, dropout_p, up_mode)
- self.conv = ConvScSEBlock(dim, in_channels2 * 2, out_channels, dropout_p, kernel_size, padding,
- stride, dilation, norm_type)
-
-class EncoderScSE(Encoder):
- """
- Encoder of 2D UNet with ScSE.
-
- The parameters for the backbone should be given in the `params` dictionary.
- See :mod:`pymic.net.net2d.unet2d.Encoder` for details.
- """
- def __init__(self, params):
- super(EncoderScSE, self).__init__(params)
-
- self.in_conv= ConvScSEBlock(self.dim, self.in_chns, self.ft_chns[0], self.dropout[0])
- self.down1 = DownScSEBlock(self.dim, self.ft_chns[0], self.ft_chns[1], self.dropout[1])
- self.down2 = DownScSEBlock(self.dim, self.ft_chns[1], self.ft_chns[2], self.dropout[2])
- self.down3 = DownScSEBlock(self.dim, self.ft_chns[2], self.ft_chns[3], self.dropout[3])
- self.down4 = DownScSEBlock(self.dim, self.ft_chns[3], self.ft_chns[4], self.dropout[4])
-
-class DecoderScSE(Decoder):
- """
- Decoder of 2D UNet with ScSE.
-
- The parameters for the backbone should be given in the `params` dictionary.
- See :mod:`pymic.net.net2d.unet2d.Decoder` for details.
- """
- def __init__(self, params):
- super(DecoderScSE, self).__init__(params)
- self.up1 = UpScSEBlock(self.dim, self.ft_chns[4], self.ft_chns[3], self.ft_chns[3], self.dropout[3], self.up_mode)
- self.up2 = UpScSEBlock(self.dim, self.ft_chns[3], self.ft_chns[2], self.ft_chns[2], self.dropout[2], self.up_mode)
- self.up3 = UpScSEBlock(self.dim, self.ft_chns[2], self.ft_chns[1], self.ft_chns[1], self.dropout[1], self.up_mode)
- self.up4 = UpScSEBlock(self.dim, self.ft_chns[1], self.ft_chns[0], self.ft_chns[0], self.dropout[0], self.up_mode)
-
-
-class UNet_ScSE(UNet):
- """
- Combining 2D U-Net with SCSE module.
-
- * Reference: Abhijit Guha Roy, Nassir Navab, Christian Wachinger:
- Recalibrating Fully Convolutional Networks With Spatial and Channel
- "Squeeze and Excitation" Blocks.
- `IEEE Trans. Med. Imaging 38(2): 540-549 (2019). `_
-
- The parameters for the backbone should be given in the `params` dictionary.
- See :mod:`pymic.net.net2d.unet2d.unet2d` for details.
- """
- def __init__(self, params):
- super(UNet_ScSE, self).__init__(params)
- self.encoder = EncoderScSE(params)
- self.decoder = DecoderScSE(params)
diff --git a/pymic/net/multi_net.py b/pymic/net/multi_net.py
deleted file mode 100644
index 78209b1..0000000
--- a/pymic/net/multi_net.py
+++ /dev/null
@@ -1,32 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-
-import torch
-import torch.nn as nn
-
-class MultiNet(nn.Module):
- '''
- A combination of multiple networks.
- Parameters should be saved in the `params` dictionary.
-
- :param `net_names`: (list) A list of network class name.
- :param `infer_mode`: (int) Mode for inference. 0: only use the first network.
- 1: taking an average of all the networks.
- '''
- def __init__(self, net_dict, params):
- super(MultiNet, self).__init__()
- net_names = params['net_type'] # should be a list of network class name
- self.output_mode = params.get('infer_mode', 0)
- self.networks = nn.ModuleList([net_dict[item](params) for item in net_names])
-
- def forward(self, x):
- if(self.training):
- output = [net(x) for net in self.networks]
- else:
- output = self.networks[0](x)
- if(self.output_mode == 1):
- for i in range(1, len(self.networks)):
- output += self.networks[i](x)
- output = output / len(self.networks)
- return output
-
\ No newline at end of file
diff --git a/pymic/net/net2d/__init__.py b/pymic/net/net2d/__init__.py
deleted file mode 100644
index 72b8078..0000000
--- a/pymic/net/net2d/__init__.py
+++ /dev/null
@@ -1,2 +0,0 @@
-from __future__ import absolute_import
-from . import *
\ No newline at end of file
diff --git a/pymic/net/net2d/cople_net.py b/pymic/net/net2d/cople_net.py
deleted file mode 100644
index 046dee8..0000000
--- a/pymic/net/net2d/cople_net.py
+++ /dev/null
@@ -1,239 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-import torch
-import torch.nn as nn
-
-class ConvLayer(nn.Module):
- """
- A combination of Conv2d, BatchNorm2d and LeakyReLU.
- """
- def __init__(self, in_channels, out_channels, kernel_size = 1):
- super(ConvLayer, self).__init__()
- padding = int((kernel_size - 1) / 2)
- self.conv = nn.Sequential(
- nn.Conv2d(in_channels, out_channels, kernel_size=kernel_size, padding=padding),
- nn.BatchNorm2d(out_channels),
- nn.LeakyReLU()
- )
-
- def forward(self, x):
- return self.conv(x)
-
-class SEBlock(nn.Module):
- """
- A Modified Squeeze-and-Excitation block for spatial attention.
- """
- def __init__(self, in_channels, r):
- super(SEBlock, self).__init__()
-
- redu_chns = int(in_channels / r)
- self.se_layers = nn.Sequential(
- nn.AdaptiveAvgPool2d(1),
- nn.Conv2d(in_channels, redu_chns, kernel_size=1, padding=0),
- nn.LeakyReLU(),
- nn.Conv2d(redu_chns, in_channels, kernel_size=1, padding=0),
- nn.ReLU())
-
- def forward(self, x):
- f = self.se_layers(x)
- return f*x + x
-
-class ASPPBlock(nn.Module):
- """
- ASPP block.
- """
- def __init__(self,in_channels, out_channels_list, kernel_size_list, dilation_list):
- super(ASPPBlock, self).__init__()
- self.conv_num = len(out_channels_list)
- assert(self.conv_num == 4)
- assert(self.conv_num == len(kernel_size_list) and self.conv_num == len(dilation_list))
- pad0 = int((kernel_size_list[0] - 1) / 2 * dilation_list[0])
- pad1 = int((kernel_size_list[1] - 1) / 2 * dilation_list[1])
- pad2 = int((kernel_size_list[2] - 1) / 2 * dilation_list[2])
- pad3 = int((kernel_size_list[3] - 1) / 2 * dilation_list[3])
- self.conv_1 = nn.Conv2d(in_channels, out_channels_list[0], kernel_size = kernel_size_list[0],
- dilation = dilation_list[0], padding = pad0 )
- self.conv_2 = nn.Conv2d(in_channels, out_channels_list[1], kernel_size = kernel_size_list[1],
- dilation = dilation_list[1], padding = pad1 )
- self.conv_3 = nn.Conv2d(in_channels, out_channels_list[2], kernel_size = kernel_size_list[2],
- dilation = dilation_list[2], padding = pad2 )
- self.conv_4 = nn.Conv2d(in_channels, out_channels_list[3], kernel_size = kernel_size_list[3],
- dilation = dilation_list[3], padding = pad3 )
-
- out_channels = out_channels_list[0] + out_channels_list[1] + out_channels_list[2] + out_channels_list[3]
- self.conv_1x1 = nn.Sequential(
- nn.Conv2d(out_channels, out_channels, kernel_size=1, padding=0),
- nn.BatchNorm2d(out_channels),
- nn.LeakyReLU())
-
- def forward(self, x):
- x1 = self.conv_1(x)
- x2 = self.conv_2(x)
- x3 = self.conv_3(x)
- x4 = self.conv_4(x)
-
- y = torch.cat([x1, x2, x3, x4], dim=1)
- y = self.conv_1x1(y)
- return y
-
-class ConvBNActBlock(nn.Module):
- """
- Two convolution layers with batch norm, leaky relu,
- dropout and SE block.
- """
- def __init__(self,in_channels, out_channels, dropout_p):
- super(ConvBNActBlock, self).__init__()
- self.conv_conv = nn.Sequential(
- nn.Conv2d(in_channels, out_channels, kernel_size=3, padding=1),
- nn.BatchNorm2d(out_channels),
- nn.LeakyReLU(),
- nn.Dropout(dropout_p),
- nn.Conv2d(out_channels, out_channels, kernel_size=3, padding=1),
- nn.BatchNorm2d(out_channels),
- nn.LeakyReLU(),
- SEBlock(out_channels, 2)
- )
-
- def forward(self, x):
- return self.conv_conv(x)
-
-class DownBlock(nn.Module):
- """
- Downsampling by a concantenation of max-pool and avg-pool,
- followed by ConvBNActBlock.
- """
- def __init__(self, in_channels, out_channels, dropout_p):
- super(DownBlock, self).__init__()
- self.maxpool = nn.MaxPool2d(2)
- self.avgpool = nn.AvgPool2d(2)
- self.conv = ConvBNActBlock(2 * in_channels, out_channels, dropout_p)
-
- def forward(self, x):
- x_max = self.maxpool(x)
- x_avg = self.avgpool(x)
- x_cat = torch.cat([x_max, x_avg], dim=1)
- y = self.conv(x_cat)
- return y + x_cat
-
-class UpBlock(nn.Module):
- """
- Upssampling followed by ConvBNActBlock.
- """
- def __init__(self, in_channels1, in_channels2, out_channels,
- up_mode = 2, dropout_p = 0.5):
- super(UpBlock, self).__init__()
- if(isinstance(up_mode, int)):
- up_mode_values = ["transconv", "nearest", "bilinear", "bicubic"]
- if(up_mode > 3):
- raise ValueError("The upsample mode should be 0-3, but {0:} is given.".format(up_mode))
- self.up_mode = up_mode_values[up_mode]
- else:
- self.up_mode = up_mode.lower()
-
- if (self.up_mode == "transconv"):
- self.up = nn.ConvTranspose2d(in_channels1, in_channels2, kernel_size=2, stride=2)
- else:
- self.conv1x1 = nn.Conv2d(in_channels1, in_channels2, kernel_size = 1)
- if(self.up_mode == "nearest"):
- self.up = nn.Upsample(scale_factor=2, mode=self.up_mode)
- else:
- self.up = nn.Upsample(scale_factor=2, mode=self.up_mode, align_corners=True)
- self.conv = ConvBNActBlock(in_channels2 * 2, out_channels, dropout_p)
-
- def forward(self, x1, x2):
- if self.up_mode != "transconv":
- x1 = self.conv1x1(x1)
- x1 = self.up(x1)
- x_cat = torch.cat([x2, x1], dim=1)
- y = self.conv(x_cat)
- return y + x_cat
-
-class COPLENet(nn.Module):
- """
- Implementation of of COPLENet for COVID-19 pneumonia lesion segmentation from CT images.
-
- * Reference: G. Wang et al. `A Noise-robust Framework for Automatic Segmentation of COVID-19 Pneumonia Lesions
- from CT Images `_.
- IEEE Transactions on Medical Imaging, 39(8),2020:2653-2663.
-
- Parameters are given in the `params` dictionary, and should include the
- following fields:
-
- :param in_chns: (int) Input channel number.
- :param feature_chns: (list) Feature channel for each resolution level.
- The length should be 5, such as [16, 32, 64, 128, 256].
- :param dropout: (list) The dropout ratio for each resolution level.
- The length should be the same as that of `feature_chns`.
- :param class_num: (int) The class number for segmentation task.
- :param bilinear: (bool) Using bilinear for up-sampling or not.
- If False, deconvolution will be used for up-sampling.
- """
- def __init__(self, params):
- super(COPLENet, self).__init__()
- self.params = params
- self.in_chns = self.params['in_chns']
- self.ft_chns = self.params['feature_chns']
- self.dropout = self.params['dropout']
- self.n_class = self.params['class_num']
- self.up_mode = self.params.get('up_mode', 2)
- assert(len(self.ft_chns) == 5)
-
- f0_half = int(self.ft_chns[0] / 2)
- f1_half = int(self.ft_chns[1] / 2)
- f2_half = int(self.ft_chns[2] / 2)
- f3_half = int(self.ft_chns[3] / 2)
- self.in_conv= ConvBNActBlock(self.in_chns, self.ft_chns[0], self.dropout[0])
- self.down1 = DownBlock(self.ft_chns[0], self.ft_chns[1], self.dropout[1])
- self.down2 = DownBlock(self.ft_chns[1], self.ft_chns[2], self.dropout[2])
- self.down3 = DownBlock(self.ft_chns[2], self.ft_chns[3], self.dropout[3])
- self.down4 = DownBlock(self.ft_chns[3], self.ft_chns[4], self.dropout[4])
-
- self.bridge0= ConvLayer(self.ft_chns[0], f0_half)
- self.bridge1= ConvLayer(self.ft_chns[1], f1_half)
- self.bridge2= ConvLayer(self.ft_chns[2], f2_half)
- self.bridge3= ConvLayer(self.ft_chns[3], f3_half)
-
- self.up1 = UpBlock(self.ft_chns[4], f3_half, self.ft_chns[3], self.up_mode, dropout_p = self.dropout[3])
- self.up2 = UpBlock(self.ft_chns[3], f2_half, self.ft_chns[2], self.up_mode, dropout_p = self.dropout[2])
- self.up3 = UpBlock(self.ft_chns[2], f1_half, self.ft_chns[1], self.up_mode, dropout_p = self.dropout[1])
- self.up4 = UpBlock(self.ft_chns[1], f0_half, self.ft_chns[0], self.up_mode, dropout_p = self.dropout[0])
-
- f4 = self.ft_chns[4]
- aspp_chns = [int(f4 / 4), int(f4 / 4), int(f4 / 4), int(f4 / 4)]
- aspp_knls = [1, 3, 3, 3]
- aspp_dila = [1, 2, 4, 6]
- self.aspp = ASPPBlock(f4, aspp_chns, aspp_knls, aspp_dila)
-
-
- self.out_conv = nn.Conv2d(self.ft_chns[0], self.n_class,
- kernel_size = 3, padding = 1)
-
- def forward(self, x):
- x_shape = list(x.shape)
- if(len(x_shape) == 5):
- [N, C, D, H, W] = x_shape
- new_shape = [N*D, C, H, W]
- x = torch.transpose(x, 1, 2)
- x = torch.reshape(x, new_shape)
- x0 = self.in_conv(x)
- x0b = self.bridge0(x0)
- x1 = self.down1(x0)
- x1b = self.bridge1(x1)
- x2 = self.down2(x1)
- x2b = self.bridge2(x2)
- x3 = self.down3(x2)
- x3b = self.bridge3(x3)
- x4 = self.down4(x3)
- x4 = self.aspp(x4)
-
- x = self.up1(x4, x3b)
- x = self.up2(x, x2b)
- x = self.up3(x, x1b)
- x = self.up4(x, x0b)
- output = self.out_conv(x)
-
- if(len(x_shape) == 5):
- new_shape = [N, D] + list(output.shape)[1:]
- output = torch.reshape(output, new_shape)
- output = torch.transpose(output, 1, 2)
- return output
\ No newline at end of file
diff --git a/pymic/net/net2d/scse2d.py b/pymic/net/net2d/scse2d.py
deleted file mode 100644
index bd80713..0000000
--- a/pymic/net/net2d/scse2d.py
+++ /dev/null
@@ -1,130 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-2D implementation of: \n
-1. Channel Squeeze and Excitation \n
-2. Spatial Squeeze and Excitation \n
-3. Concurrent Spatial and Channel Squeeze & Excitation
-
-Oringinal file is on `Github.
-`_
-"""
-from __future__ import print_function, division
-from enum import Enum
-import torch
-import torch.nn as nn
-import torch.nn.functional as F
-
-class ChannelSELayer(nn.Module):
- """
- Re-implementation of Squeeze-and-Excitation (SE) block.
-
- * Reference: Jie Hu, Li Shen, Gang Sun: Squeeze-and-Excitation Networks.
- `CVPR 2018. `_
-
- :param num_channels: Number of input channels
- :param reduction_ratio: By how much should the num_channels should be reduced.
- """
- def __init__(self, num_channels, reduction_ratio=2):
- super(ChannelSELayer, self).__init__()
- num_channels_reduced = num_channels // reduction_ratio
- self.reduction_ratio = reduction_ratio
- self.fc1 = nn.Linear(num_channels, num_channels_reduced, bias=True)
- self.fc2 = nn.Linear(num_channels_reduced, num_channels, bias=True)
- self.relu = nn.ReLU()
- self.sigmoid = nn.Sigmoid()
-
- def forward(self, input_tensor):
- """
- :param input_tensor: X, shape = (batch_size, num_channels, H, W)
- :return: output tensor
- """
-
- batch_size, num_channels, H, W = input_tensor.size()
- # Average along each channel
- squeeze_tensor = input_tensor.view(batch_size, num_channels, -1).mean(dim=2)
- # channel excitation
- fc_out_1 = self.relu(self.fc1(squeeze_tensor))
- fc_out_2 = self.sigmoid(self.fc2(fc_out_1))
-
- a, b = squeeze_tensor.size()
- output_tensor = torch.mul(input_tensor, fc_out_2.view(a, b, 1, 1))
-
- return output_tensor
-
-class SpatialSELayer(nn.Module):
- """
- Re-implementation of SE block -- squeezing spatially and exciting channel-wise.
-
- * Reference: Roy et al., Concurrent Spatial and Channel Squeeze & Excitation in
- Fully Convolutional Networks, MICCAI 2018.
-
- :param num_channels: Number of input channels.
- """
- def __init__(self, num_channels):
- super(SpatialSELayer, self).__init__()
- self.conv = nn.Conv2d(num_channels, 1, 1)
- self.sigmoid = nn.Sigmoid()
-
- def forward(self, input_tensor, weights=None):
- """
- :param weights: weights for few shot learning
- :param input_tensor: X, shape = (batch_size, num_channels, H, W)
- :return: output_tensor
- """
- # spatial squeeze
- batch_size, channel, a, b = input_tensor.size()
- if weights is not None:
- weights = torch.mean(weights, dim=0)
- weights = weights.view(1, channel, 1, 1)
- out = F.conv2d(input_tensor, weights)
- else:
- out = self.conv(input_tensor)
- squeeze_tensor = self.sigmoid(out)
-
- # spatial excitation
- # print(input_tensor.size(), squeeze_tensor.size())
- squeeze_tensor = squeeze_tensor.view(batch_size, 1, a, b)
- output_tensor = torch.mul(input_tensor, squeeze_tensor)
-
- #output_tensor = torch.mul(input_tensor, squeeze_tensor)
- return output_tensor
-
-
-class ChannelSpatialSELayer(nn.Module):
- """
- Re-implementation of concurrent spatial and channel squeeze & excitation.
-
- * Reference: Roy et al., Concurrent Spatial and Channel Squeeze & Excitation in
- Fully Convolutional Networks, MICCAI 2018.
-
- :param num_channels: Number of input channels.
- :param reduction_ratio: By how much should the num_channels should be reduced.
- """
- def __init__(self, num_channels, reduction_ratio=2):
- super(ChannelSpatialSELayer, self).__init__()
- self.cSE = ChannelSELayer(num_channels, reduction_ratio)
- self.sSE = SpatialSELayer(num_channels)
-
- def forward(self, input_tensor):
- """
- :param input_tensor: X, shape = (batch_size, num_channels, H, W)
- :return: output_tensor
- """
- output_tensor = torch.max(self.cSE(input_tensor), self.sSE(input_tensor))
- return output_tensor
-
-class SELayer(Enum):
- """
- Enum restricting the type of SE Blockes available. So that type checking can be adding when adding these blockes to
- a neural network::
- if self.se_block_type == se.SELayer.CSE.value:
- self.SELayer = se.ChannelSpatialSELayer(params['num_filters'])
- elif self.se_block_type == se.SELayer.SSE.value:
- self.SELayer = se.SpatialSELayer(params['num_filters'])
- elif self.se_block_type == se.SELayer.CSSE.value:
- self.SELayer = se.ChannelSpatialSELayer(params['num_filters'])
- """
- NONE = 'NONE'
- CSE = 'CSE'
- SSE = 'SSE'
- CSSE = 'CSSE'
\ No newline at end of file
diff --git a/pymic/net/net2d/trans2d/__init__.py b/pymic/net/net2d/trans2d/__init__.py
deleted file mode 100644
index e69de29..0000000
diff --git a/pymic/net/net2d/trans2d/swinunet.py b/pymic/net/net2d/trans2d/swinunet.py
deleted file mode 100644
index f35539a..0000000
--- a/pymic/net/net2d/trans2d/swinunet.py
+++ /dev/null
@@ -1,124 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-code adapted from: https://github.com/HuCaoFighting/Swin-Unet
-
-"""
-from __future__ import print_function, division
-
-import copy
-import numpy as np
-import torch
-import torch.nn as nn
-
-from pymic.net.net2d.trans2d.swinunet_sys import SwinTransformerSys
-
-class SwinUNet(nn.Module):
- """
- Implementatin of Swin-UNet.
-
- * Reference: Hu Cao, Yueyue Wang et al:
- Swin-Unet: Unet-Like Pure Transformer for Medical Image Segmentation.
- `ECCV 2022 Workshops. `_
-
- Note that the input channel can only be 1 or 3, and the input image size should be 224x224.
- Parameters are given in the `params` dictionary, and should include the
- following fields:
-
- :param img_size: (tuple) The input image size, should be [224, 224].
- :param class_num: (int) The class number for segmentation task.
- """
- def __init__(self, params):
- super(SwinUNet, self).__init__()
- img_size = params['img_size']
- if(isinstance(img_size, tuple) or isinstance(img_size, list)):
- img_size = img_size[0]
- self.num_classes = params['class_num']
- self.swin_unet = SwinTransformerSys(img_size = img_size, num_classes=self.num_classes)
- # self.swin_unet = SwinTransformerSys(img_size=config.DATA.IMG_SIZE,
- # patch_size=config.MODEL.SWIN.PATCH_SIZE,
- # in_chans=config.MODEL.SWIN.IN_CHANS,
- # num_classes=self.num_classes,
- # embed_dim=config.MODEL.SWIN.EMBED_DIM,
- # depths=config.MODEL.SWIN.DEPTHS,
- # num_heads=config.MODEL.SWIN.NUM_HEADS,
- # window_size=config.MODEL.SWIN.WINDOW_SIZE,
- # mlp_ratio=config.MODEL.SWIN.MLP_RATIO,
- # qkv_bias=config.MODEL.SWIN.QKV_BIAS,
- # qk_scale=config.MODEL.SWIN.QK_SCALE,
- # drop_rate=config.MODEL.DROP_RATE,
- # drop_path_rate=config.MODEL.DROP_PATH_RATE,
- # ape=config.MODEL.SWIN.APE,
- # patch_norm=config.MODEL.SWIN.PATCH_NORM,
- # use_checkpoint=config.TRAIN.USE_CHECKPOINT)
-
- def forward(self, x):
- x_shape = list(x.shape)
- if(len(x_shape) == 5):
- [N, C, D, H, W] = x_shape
- new_shape = [N*D, C, H, W]
- x = torch.transpose(x, 1, 2)
- x = torch.reshape(x, new_shape)
-
- if x.size()[1] == 1:
- x = x.repeat(1,3,1,1)
- logits = self.swin_unet(x)
-
- if(len(x_shape) == 5):
- new_shape = [N, D] + list(logits.shape)[1:]
- logits = torch.reshape(logits, new_shape)
- logits = torch.transpose(logits, 1, 2)
-
- return logits
-
- def load_from(self, config):
- pretrained_path = config.MODEL.PRETRAIN_CKPT
- if pretrained_path is not None:
- print("pretrained_path:{}".format(pretrained_path))
- device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
- pretrained_dict = torch.load(pretrained_path, map_location=device)
- if "model" not in pretrained_dict:
- print("---start load pretrained modle by splitting---")
- pretrained_dict = {k[17:]:v for k,v in pretrained_dict.items()}
- for k in list(pretrained_dict.keys()):
- if "output" in k:
- print("delete key:{}".format(k))
- del pretrained_dict[k]
- msg = self.swin_unet.load_state_dict(pretrained_dict,strict=False)
- # print(msg)
- return
- pretrained_dict = pretrained_dict['model']
- print("---start load pretrained modle of swin encoder---")
-
- model_dict = self.swin_unet.state_dict()
- full_dict = copy.deepcopy(pretrained_dict)
- for k, v in pretrained_dict.items():
- if "layers." in k:
- current_layer_num = 3-int(k[7:8])
- current_k = "layers_up." + str(current_layer_num) + k[8:]
- full_dict.update({current_k:v})
- for k in list(full_dict.keys()):
- if k in model_dict:
- if full_dict[k].shape != model_dict[k].shape:
- print("delete:{};shape pretrain:{};shape model:{}".format(k,v.shape,model_dict[k].shape))
- del full_dict[k]
-
- msg = self.swin_unet.load_state_dict(full_dict, strict=False)
- # print(msg)
- else:
- print("none pretrain")
-
-
-if __name__ == "__main__":
- params = {'img_size': [224, 224],
- 'class_num': 2}
- net = SwinUNet(params)
- net.double()
-
- x = np.random.rand(4, 3, 224, 224)
- xt = torch.from_numpy(x)
- xt = torch.tensor(xt)
-
- y = net(xt)
- print(len(y.size()))
- y = y.detach().numpy()
- print(y.shape)
\ No newline at end of file
diff --git a/pymic/net/net2d/trans2d/swinunet_sys.py b/pymic/net/net2d/trans2d/swinunet_sys.py
deleted file mode 100644
index a6e3552..0000000
--- a/pymic/net/net2d/trans2d/swinunet_sys.py
+++ /dev/null
@@ -1,749 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-code adapted from: https://github.com/HuCaoFighting/Swin-Unet
-
-"""
-from __future__ import print_function, division
-
-import torch
-import torch.nn as nn
-import torch.utils.checkpoint as checkpoint
-from einops import rearrange
-from timm.models.layers import DropPath, to_2tuple, trunc_normal_
-
-
-class Mlp(nn.Module):
- def __init__(self, in_features, hidden_features=None, out_features=None, act_layer=nn.GELU, drop=0.):
- super().__init__()
- out_features = out_features or in_features
- hidden_features = hidden_features or in_features
- self.fc1 = nn.Linear(in_features, hidden_features)
- self.act = act_layer()
- self.fc2 = nn.Linear(hidden_features, out_features)
- self.drop = nn.Dropout(drop)
-
- def forward(self, x):
- x = self.fc1(x)
- x = self.act(x)
- x = self.drop(x)
- x = self.fc2(x)
- x = self.drop(x)
- return x
-
-
-def window_partition(x, window_size):
- """
- Args:
- x: (B, H, W, C)
- window_size (int): window size
- Returns:
- windows: (num_windows*B, window_size, window_size, C)
- """
- B, H, W, C = x.shape
- x = x.view(B, H // window_size, window_size, W // window_size, window_size, C)
- windows = x.permute(0, 1, 3, 2, 4, 5).contiguous().view(-1, window_size, window_size, C)
- return windows
-
-
-def window_reverse(windows, window_size, H, W):
- """
- Args:
- windows: (num_windows*B, window_size, window_size, C)
- window_size (int): Window size
- H (int): Height of image
- W (int): Width of image
- Returns:
- x: (B, H, W, C)
- """
- B = int(windows.shape[0] / (H * W / window_size / window_size))
- x = windows.view(B, H // window_size, W // window_size, window_size, window_size, -1)
- x = x.permute(0, 1, 3, 2, 4, 5).contiguous().view(B, H, W, -1)
- return x
-
-
-class WindowAttention(nn.Module):
- r""" Window based multi-head self attention (W-MSA) module with relative position bias.
- It supports both of shifted and non-shifted window.
- Args:
- dim (int): Number of input channels.
- window_size (tuple[int]): The height and width of the window.
- num_heads (int): Number of attention heads.
- qkv_bias (bool, optional): If True, add a learnable bias to query, key, value. Default: True
- qk_scale (float | None, optional): Override default qk scale of head_dim ** -0.5 if set
- attn_drop (float, optional): Dropout ratio of attention weight. Default: 0.0
- proj_drop (float, optional): Dropout ratio of output. Default: 0.0
- """
-
- def __init__(self, dim, window_size, num_heads, qkv_bias=True, qk_scale=None, attn_drop=0., proj_drop=0.):
-
- super().__init__()
- self.dim = dim
- self.window_size = window_size # Wh, Ww
- self.num_heads = num_heads
- head_dim = dim // num_heads
- self.scale = qk_scale or head_dim ** -0.5
-
- # define a parameter table of relative position bias
- self.relative_position_bias_table = nn.Parameter(
- torch.zeros((2 * window_size[0] - 1) * (2 * window_size[1] - 1), num_heads)) # 2*Wh-1 * 2*Ww-1, nH
-
- # get pair-wise relative position index for each token inside the window
- coords_h = torch.arange(self.window_size[0])
- coords_w = torch.arange(self.window_size[1])
- coords = torch.stack(torch.meshgrid([coords_h, coords_w])) # 2, Wh, Ww
- coords_flatten = torch.flatten(coords, 1) # 2, Wh*Ww
- relative_coords = coords_flatten[:, :, None] - coords_flatten[:, None, :] # 2, Wh*Ww, Wh*Ww
- relative_coords = relative_coords.permute(1, 2, 0).contiguous() # Wh*Ww, Wh*Ww, 2
- relative_coords[:, :, 0] += self.window_size[0] - 1 # shift to start from 0
- relative_coords[:, :, 1] += self.window_size[1] - 1
- relative_coords[:, :, 0] *= 2 * self.window_size[1] - 1
- relative_position_index = relative_coords.sum(-1) # Wh*Ww, Wh*Ww
- self.register_buffer("relative_position_index", relative_position_index)
-
- self.qkv = nn.Linear(dim, dim * 3, bias=qkv_bias)
- self.attn_drop = nn.Dropout(attn_drop)
- self.proj = nn.Linear(dim, dim)
- self.proj_drop = nn.Dropout(proj_drop)
-
- trunc_normal_(self.relative_position_bias_table, std=.02)
- self.softmax = nn.Softmax(dim=-1)
-
- def forward(self, x, mask=None):
- """
- Args:
- x: input features with shape of (num_windows*B, N, C)
- mask: (0/-inf) mask with shape of (num_windows, Wh*Ww, Wh*Ww) or None
- """
- B_, N, C = x.shape
- qkv = self.qkv(x).reshape(B_, N, 3, self.num_heads, C // self.num_heads).permute(2, 0, 3, 1, 4)
- q, k, v = qkv[0], qkv[1], qkv[2] # make torchscript happy (cannot use tensor as tuple)
-
- q = q * self.scale
- attn = (q @ k.transpose(-2, -1))
-
- relative_position_bias = self.relative_position_bias_table[self.relative_position_index.view(-1)].view(
- self.window_size[0] * self.window_size[1], self.window_size[0] * self.window_size[1], -1) # Wh*Ww,Wh*Ww,nH
- relative_position_bias = relative_position_bias.permute(2, 0, 1).contiguous() # nH, Wh*Ww, Wh*Ww
- attn = attn + relative_position_bias.unsqueeze(0)
-
- if mask is not None:
- nW = mask.shape[0]
- attn = attn.view(B_ // nW, nW, self.num_heads, N, N) + mask.unsqueeze(1).unsqueeze(0)
- attn = attn.view(-1, self.num_heads, N, N)
- attn = self.softmax(attn)
- else:
- attn = self.softmax(attn)
-
- attn = self.attn_drop(attn)
-
- x = (attn @ v).transpose(1, 2).reshape(B_, N, C)
- x = self.proj(x)
- x = self.proj_drop(x)
- return x
-
- def extra_repr(self) -> str:
- return f'dim={self.dim}, window_size={self.window_size}, num_heads={self.num_heads}'
-
- def flops(self, N):
- # calculate flops for 1 window with token length of N
- flops = 0
- # qkv = self.qkv(x)
- flops += N * self.dim * 3 * self.dim
- # attn = (q @ k.transpose(-2, -1))
- flops += self.num_heads * N * (self.dim // self.num_heads) * N
- # x = (attn @ v)
- flops += self.num_heads * N * N * (self.dim // self.num_heads)
- # x = self.proj(x)
- flops += N * self.dim * self.dim
- return flops
-
-
-class SwinTransformerBlock(nn.Module):
- r""" Swin Transformer Block.
- Args:
- dim (int): Number of input channels.
- input_resolution (tuple[int]): Input resulotion.
- num_heads (int): Number of attention heads.
- window_size (int): Window size.
- shift_size (int): Shift size for SW-MSA.
- mlp_ratio (float): Ratio of mlp hidden dim to embedding dim.
- qkv_bias (bool, optional): If True, add a learnable bias to query, key, value. Default: True
- qk_scale (float | None, optional): Override default qk scale of head_dim ** -0.5 if set.
- drop (float, optional): Dropout rate. Default: 0.0
- attn_drop (float, optional): Attention dropout rate. Default: 0.0
- drop_path (float, optional): Stochastic depth rate. Default: 0.0
- act_layer (nn.Module, optional): Activation layer. Default: nn.GELU
- norm_layer (nn.Module, optional): Normalization layer. Default: nn.LayerNorm
- """
-
- def __init__(self, dim, input_resolution, num_heads, window_size=7, shift_size=0,
- mlp_ratio=4., qkv_bias=True, qk_scale=None, drop=0., attn_drop=0., drop_path=0.,
- act_layer=nn.GELU, norm_layer=nn.LayerNorm):
- super().__init__()
- self.dim = dim
- self.input_resolution = input_resolution
- self.num_heads = num_heads
- self.window_size = window_size
- self.shift_size = shift_size
- self.mlp_ratio = mlp_ratio
- if min(self.input_resolution) <= self.window_size:
- # if window size is larger than input resolution, we don't partition windows
- self.shift_size = 0
- self.window_size = min(self.input_resolution)
- assert 0 <= self.shift_size < self.window_size, "shift_size must in 0-window_size"
-
- self.norm1 = norm_layer(dim)
- self.attn = WindowAttention(
- dim, window_size=to_2tuple(self.window_size), num_heads=num_heads,
- qkv_bias=qkv_bias, qk_scale=qk_scale, attn_drop=attn_drop, proj_drop=drop)
-
- self.drop_path = DropPath(drop_path) if drop_path > 0. else nn.Identity()
- self.norm2 = norm_layer(dim)
- mlp_hidden_dim = int(dim * mlp_ratio)
- self.mlp = Mlp(in_features=dim, hidden_features=mlp_hidden_dim, act_layer=act_layer, drop=drop)
-
- if self.shift_size > 0:
- # calculate attention mask for SW-MSA
- H, W = self.input_resolution
- img_mask = torch.zeros((1, H, W, 1)) # 1 H W 1
- h_slices = (slice(0, -self.window_size),
- slice(-self.window_size, -self.shift_size),
- slice(-self.shift_size, None))
- w_slices = (slice(0, -self.window_size),
- slice(-self.window_size, -self.shift_size),
- slice(-self.shift_size, None))
- cnt = 0
- for h in h_slices:
- for w in w_slices:
- img_mask[:, h, w, :] = cnt
- cnt += 1
-
- mask_windows = window_partition(img_mask, self.window_size) # nW, window_size, window_size, 1
- mask_windows = mask_windows.view(-1, self.window_size * self.window_size)
- attn_mask = mask_windows.unsqueeze(1) - mask_windows.unsqueeze(2)
- attn_mask = attn_mask.masked_fill(attn_mask != 0, float(-100.0)).masked_fill(attn_mask == 0, float(0.0))
- else:
- attn_mask = None
-
- self.register_buffer("attn_mask", attn_mask)
-
- def forward(self, x):
- H, W = self.input_resolution
- B, L, C = x.shape
- assert L == H * W, "input feature has wrong size"
-
- shortcut = x
- x = self.norm1(x)
- x = x.view(B, H, W, C)
-
- # cyclic shift
- if self.shift_size > 0:
- shifted_x = torch.roll(x, shifts=(-self.shift_size, -self.shift_size), dims=(1, 2))
- else:
- shifted_x = x
-
- # partition windows
- x_windows = window_partition(shifted_x, self.window_size) # nW*B, window_size, window_size, C
- x_windows = x_windows.view(-1, self.window_size * self.window_size, C) # nW*B, window_size*window_size, C
-
- # W-MSA/SW-MSA
- attn_windows = self.attn(x_windows, mask=self.attn_mask) # nW*B, window_size*window_size, C
-
- # merge windows
- attn_windows = attn_windows.view(-1, self.window_size, self.window_size, C)
- shifted_x = window_reverse(attn_windows, self.window_size, H, W) # B H' W' C
-
- # reverse cyclic shift
- if self.shift_size > 0:
- x = torch.roll(shifted_x, shifts=(self.shift_size, self.shift_size), dims=(1, 2))
- else:
- x = shifted_x
- x = x.view(B, H * W, C)
-
- # FFN
- x = shortcut + self.drop_path(x)
- x = x + self.drop_path(self.mlp(self.norm2(x)))
-
- return x
-
- def extra_repr(self) -> str:
- return f"dim={self.dim}, input_resolution={self.input_resolution}, num_heads={self.num_heads}, " \
- f"window_size={self.window_size}, shift_size={self.shift_size}, mlp_ratio={self.mlp_ratio}"
-
- def flops(self):
- flops = 0
- H, W = self.input_resolution
- # norm1
- flops += self.dim * H * W
- # W-MSA/SW-MSA
- nW = H * W / self.window_size / self.window_size
- flops += nW * self.attn.flops(self.window_size * self.window_size)
- # mlp
- flops += 2 * H * W * self.dim * self.dim * self.mlp_ratio
- # norm2
- flops += self.dim * H * W
- return flops
-
-
-class PatchMerging(nn.Module):
- r""" Patch Merging Layer.
- Args:
- input_resolution (tuple[int]): Resolution of input feature.
- dim (int): Number of input channels.
- norm_layer (nn.Module, optional): Normalization layer. Default: nn.LayerNorm
- """
-
- def __init__(self, input_resolution, dim, norm_layer=nn.LayerNorm):
- super().__init__()
- self.input_resolution = input_resolution
- self.dim = dim
- self.reduction = nn.Linear(4 * dim, 2 * dim, bias=False)
- self.norm = norm_layer(4 * dim)
-
- def forward(self, x):
- """
- x: B, H*W, C
- """
- H, W = self.input_resolution
- B, L, C = x.shape
- assert L == H * W, "input feature has wrong size"
- assert H % 2 == 0 and W % 2 == 0, f"x size ({H}*{W}) are not even."
-
- x = x.view(B, H, W, C)
-
- x0 = x[:, 0::2, 0::2, :] # B H/2 W/2 C
- x1 = x[:, 1::2, 0::2, :] # B H/2 W/2 C
- x2 = x[:, 0::2, 1::2, :] # B H/2 W/2 C
- x3 = x[:, 1::2, 1::2, :] # B H/2 W/2 C
- x = torch.cat([x0, x1, x2, x3], -1) # B H/2 W/2 4*C
- x = x.view(B, -1, 4 * C) # B H/2*W/2 4*C
-
- x = self.norm(x)
- x = self.reduction(x)
-
- return x
-
- def extra_repr(self) -> str:
- return f"input_resolution={self.input_resolution}, dim={self.dim}"
-
- def flops(self):
- H, W = self.input_resolution
- flops = H * W * self.dim
- flops += (H // 2) * (W // 2) * 4 * self.dim * 2 * self.dim
- return flops
-
-class PatchExpand(nn.Module):
- def __init__(self, input_resolution, dim, dim_scale=2, norm_layer=nn.LayerNorm):
- super().__init__()
- self.input_resolution = input_resolution
- self.dim = dim
- self.expand = nn.Linear(dim, 2*dim, bias=False) if dim_scale==2 else nn.Identity()
- self.norm = norm_layer(dim // dim_scale)
-
- def forward(self, x):
- """
- x: B, H*W, C
- """
- H, W = self.input_resolution
- x = self.expand(x)
- B, L, C = x.shape
- assert L == H * W, "input feature has wrong size"
-
- x = x.view(B, H, W, C)
- x = rearrange(x, 'b h w (p1 p2 c)-> b (h p1) (w p2) c', p1=2, p2=2, c=C//4)
- x = x.view(B,-1,C//4)
- x= self.norm(x)
-
- return x
-
-class FinalPatchExpand_X4(nn.Module):
- def __init__(self, input_resolution, dim, dim_scale=4, norm_layer=nn.LayerNorm):
- super().__init__()
- self.input_resolution = input_resolution
- self.dim = dim
- self.dim_scale = dim_scale
- self.expand = nn.Linear(dim, 16*dim, bias=False)
- self.output_dim = dim
- self.norm = norm_layer(self.output_dim)
-
- def forward(self, x):
- """
- x: B, H*W, C
- """
- H, W = self.input_resolution
- x = self.expand(x)
- B, L, C = x.shape
- assert L == H * W, "input feature has wrong size"
-
- x = x.view(B, H, W, C)
- x = rearrange(x, 'b h w (p1 p2 c)-> b (h p1) (w p2) c', p1=self.dim_scale, p2=self.dim_scale, c=C//(self.dim_scale**2))
- x = x.view(B,-1,self.output_dim)
- x= self.norm(x)
-
- return x
-
-class BasicLayer(nn.Module):
- """ A basic Swin Transformer layer for one stage.
- Args:
- dim (int): Number of input channels.
- input_resolution (tuple[int]): Input resolution.
- depth (int): Number of blocks.
- num_heads (int): Number of attention heads.
- window_size (int): Local window size.
- mlp_ratio (float): Ratio of mlp hidden dim to embedding dim.
- qkv_bias (bool, optional): If True, add a learnable bias to query, key, value. Default: True
- qk_scale (float | None, optional): Override default qk scale of head_dim ** -0.5 if set.
- drop (float, optional): Dropout rate. Default: 0.0
- attn_drop (float, optional): Attention dropout rate. Default: 0.0
- drop_path (float | tuple[float], optional): Stochastic depth rate. Default: 0.0
- norm_layer (nn.Module, optional): Normalization layer. Default: nn.LayerNorm
- downsample (nn.Module | None, optional): Downsample layer at the end of the layer. Default: None
- use_checkpoint (bool): Whether to use checkpointing to save memory. Default: False.
- """
-
- def __init__(self, dim, input_resolution, depth, num_heads, window_size,
- mlp_ratio=4., qkv_bias=True, qk_scale=None, drop=0., attn_drop=0.,
- drop_path=0., norm_layer=nn.LayerNorm, downsample=None, use_checkpoint=False):
-
- super().__init__()
- self.dim = dim
- self.input_resolution = input_resolution
- self.depth = depth
- self.use_checkpoint = use_checkpoint
-
- # build blocks
- self.blocks = nn.ModuleList([
- SwinTransformerBlock(dim=dim, input_resolution=input_resolution,
- num_heads=num_heads, window_size=window_size,
- shift_size=0 if (i % 2 == 0) else window_size // 2,
- mlp_ratio=mlp_ratio,
- qkv_bias=qkv_bias, qk_scale=qk_scale,
- drop=drop, attn_drop=attn_drop,
- drop_path=drop_path[i] if isinstance(drop_path, list) else drop_path,
- norm_layer=norm_layer)
- for i in range(depth)])
-
- # patch merging layer
- if downsample is not None:
- self.downsample = downsample(input_resolution, dim=dim, norm_layer=norm_layer)
- else:
- self.downsample = None
-
- def forward(self, x):
- for blk in self.blocks:
- if self.use_checkpoint:
- x = checkpoint.checkpoint(blk, x)
- else:
- x = blk(x)
- if self.downsample is not None:
- x = self.downsample(x)
- return x
-
- def extra_repr(self) -> str:
- return f"dim={self.dim}, input_resolution={self.input_resolution}, depth={self.depth}"
-
- def flops(self):
- flops = 0
- for blk in self.blocks:
- flops += blk.flops()
- if self.downsample is not None:
- flops += self.downsample.flops()
- return flops
-
-class BasicLayer_up(nn.Module):
- """ A basic Swin Transformer layer for one stage.
- Args:
- dim (int): Number of input channels.
- input_resolution (tuple[int]): Input resolution.
- depth (int): Number of blocks.
- num_heads (int): Number of attention heads.
- window_size (int): Local window size.
- mlp_ratio (float): Ratio of mlp hidden dim to embedding dim.
- qkv_bias (bool, optional): If True, add a learnable bias to query, key, value. Default: True
- qk_scale (float | None, optional): Override default qk scale of head_dim ** -0.5 if set.
- drop (float, optional): Dropout rate. Default: 0.0
- attn_drop (float, optional): Attention dropout rate. Default: 0.0
- drop_path (float | tuple[float], optional): Stochastic depth rate. Default: 0.0
- norm_layer (nn.Module, optional): Normalization layer. Default: nn.LayerNorm
- downsample (nn.Module | None, optional): Downsample layer at the end of the layer. Default: None
- use_checkpoint (bool): Whether to use checkpointing to save memory. Default: False.
- """
-
- def __init__(self, dim, input_resolution, depth, num_heads, window_size,
- mlp_ratio=4., qkv_bias=True, qk_scale=None, drop=0., attn_drop=0.,
- drop_path=0., norm_layer=nn.LayerNorm, upsample=None, use_checkpoint=False):
-
- super().__init__()
- self.dim = dim
- self.input_resolution = input_resolution
- self.depth = depth
- self.use_checkpoint = use_checkpoint
-
- # build blocks
- self.blocks = nn.ModuleList([
- SwinTransformerBlock(dim=dim, input_resolution=input_resolution,
- num_heads=num_heads, window_size=window_size,
- shift_size=0 if (i % 2 == 0) else window_size // 2,
- mlp_ratio=mlp_ratio,
- qkv_bias=qkv_bias, qk_scale=qk_scale,
- drop=drop, attn_drop=attn_drop,
- drop_path=drop_path[i] if isinstance(drop_path, list) else drop_path,
- norm_layer=norm_layer)
- for i in range(depth)])
-
- # patch merging layer
- if upsample is not None:
- self.upsample = PatchExpand(input_resolution, dim=dim, dim_scale=2, norm_layer=norm_layer)
- else:
- self.upsample = None
-
- def forward(self, x):
- for blk in self.blocks:
- if self.use_checkpoint:
- x = checkpoint.checkpoint(blk, x)
- else:
- x = blk(x)
- if self.upsample is not None:
- x = self.upsample(x)
- return x
-
-class PatchEmbed(nn.Module):
- r""" Image to Patch Embedding
- Args:
- img_size (int): Image size. Default: 224.
- patch_size (int): Patch token size. Default: 4.
- in_chans (int): Number of input image channels. Default: 3.
- embed_dim (int): Number of linear projection output channels. Default: 96.
- norm_layer (nn.Module, optional): Normalization layer. Default: None
- """
-
- def __init__(self, img_size=224, patch_size=4, in_chans=3, embed_dim=96, norm_layer=None):
- super().__init__()
- img_size = to_2tuple(img_size)
- patch_size = to_2tuple(patch_size)
- patches_resolution = [img_size[0] // patch_size[0], img_size[1] // patch_size[1]]
- self.img_size = img_size
- self.patch_size = patch_size
- self.patches_resolution = patches_resolution
- self.num_patches = patches_resolution[0] * patches_resolution[1]
-
- self.in_chans = in_chans
- self.embed_dim = embed_dim
-
- self.proj = nn.Conv2d(in_chans, embed_dim, kernel_size=patch_size, stride=patch_size)
- if norm_layer is not None:
- self.norm = norm_layer(embed_dim)
- else:
- self.norm = None
-
- def forward(self, x):
- B, C, H, W = x.shape
- # FIXME look at relaxing size constraints
- assert H == self.img_size[0] and W == self.img_size[1], \
- f"Input image size ({H}*{W}) doesn't match model ({self.img_size[0]}*{self.img_size[1]})."
- x = self.proj(x).flatten(2).transpose(1, 2) # B Ph*Pw C
- if self.norm is not None:
- x = self.norm(x)
- return x
-
- def flops(self):
- Ho, Wo = self.patches_resolution
- flops = Ho * Wo * self.embed_dim * self.in_chans * (self.patch_size[0] * self.patch_size[1])
- if self.norm is not None:
- flops += Ho * Wo * self.embed_dim
- return flops
-
-
-class SwinTransformerSys(nn.Module):
- r""" Swin Transformer
- A PyTorch impl of : `Swin Transformer: Hierarchical Vision Transformer using Shifted Windows` -
- https://arxiv.org/pdf/2103.14030
- Args:
- img_size (int | tuple(int)): Input image size. Default 224
- patch_size (int | tuple(int)): Patch size. Default: 4
- in_chans (int): Number of input image channels. Default: 3
- num_classes (int): Number of classes for classification head. Default: 1000
- embed_dim (int): Patch embedding dimension. Default: 96
- depths (tuple(int)): Depth of each Swin Transformer layer.
- num_heads (tuple(int)): Number of attention heads in different layers.
- window_size (int): Window size. Default: 7
- mlp_ratio (float): Ratio of mlp hidden dim to embedding dim. Default: 4
- qkv_bias (bool): If True, add a learnable bias to query, key, value. Default: True
- qk_scale (float): Override default qk scale of head_dim ** -0.5 if set. Default: None
- drop_rate (float): Dropout rate. Default: 0
- attn_drop_rate (float): Attention dropout rate. Default: 0
- drop_path_rate (float): Stochastic depth rate. Default: 0.1
- norm_layer (nn.Module): Normalization layer. Default: nn.LayerNorm.
- ape (bool): If True, add absolute position embedding to the patch embedding. Default: False
- patch_norm (bool): If True, add normalization after patch embedding. Default: True
- use_checkpoint (bool): Whether to use checkpointing to save memory. Default: False
- """
-
- def __init__(self, img_size=224, patch_size=4, in_chans=3, num_classes=1000,
- embed_dim=96, depths=[2, 2, 2, 2], depths_decoder=[1, 2, 2, 2], num_heads=[3, 6, 12, 24],
- window_size=7, mlp_ratio=4., qkv_bias=True, qk_scale=None,
- drop_rate=0., attn_drop_rate=0., drop_path_rate=0.1,
- norm_layer=nn.LayerNorm, ape=False, patch_norm=True,
- use_checkpoint=False, final_upsample="expand_first", **kwargs):
- super().__init__()
-
- print("SwinTransformerSys expand initial----depths:{};depths_decoder:{};drop_path_rate:{};num_classes:{}".format(depths,
- depths_decoder,drop_path_rate,num_classes))
-
- self.num_classes = num_classes
- self.num_layers = len(depths)
- self.embed_dim = embed_dim
- self.ape = ape
- self.patch_norm = patch_norm
- self.num_features = int(embed_dim * 2 ** (self.num_layers - 1))
- self.num_features_up = int(embed_dim * 2)
- self.mlp_ratio = mlp_ratio
- self.final_upsample = final_upsample
-
- # split image into non-overlapping patches
- self.patch_embed = PatchEmbed(
- img_size=img_size, patch_size=patch_size, in_chans=in_chans, embed_dim=embed_dim,
- norm_layer=norm_layer if self.patch_norm else None)
- num_patches = self.patch_embed.num_patches
- patches_resolution = self.patch_embed.patches_resolution
- self.patches_resolution = patches_resolution
-
- # absolute position embedding
- if self.ape:
- self.absolute_pos_embed = nn.Parameter(torch.zeros(1, num_patches, embed_dim))
- trunc_normal_(self.absolute_pos_embed, std=.02)
-
- self.pos_drop = nn.Dropout(p=drop_rate)
-
- # stochastic depth
- dpr = [x.item() for x in torch.linspace(0, drop_path_rate, sum(depths))] # stochastic depth decay rule
-
- # build encoder and bottleneck layers
- self.layers = nn.ModuleList()
- for i_layer in range(self.num_layers):
- layer = BasicLayer(dim=int(embed_dim * 2 ** i_layer),
- input_resolution=(patches_resolution[0] // (2 ** i_layer),
- patches_resolution[1] // (2 ** i_layer)),
- depth=depths[i_layer],
- num_heads=num_heads[i_layer],
- window_size=window_size,
- mlp_ratio=self.mlp_ratio,
- qkv_bias=qkv_bias, qk_scale=qk_scale,
- drop=drop_rate, attn_drop=attn_drop_rate,
- drop_path=dpr[sum(depths[:i_layer]):sum(depths[:i_layer + 1])],
- norm_layer=norm_layer,
- downsample=PatchMerging if (i_layer < self.num_layers - 1) else None,
- use_checkpoint=use_checkpoint)
- self.layers.append(layer)
-
- # build decoder layers
- self.layers_up = nn.ModuleList()
- self.concat_back_dim = nn.ModuleList()
- for i_layer in range(self.num_layers):
- concat_linear = nn.Linear(2*int(embed_dim*2**(self.num_layers-1-i_layer)),
- int(embed_dim*2**(self.num_layers-1-i_layer))) if i_layer > 0 else nn.Identity()
- if i_layer ==0 :
- layer_up = PatchExpand(input_resolution=(patches_resolution[0] // (2 ** (self.num_layers-1-i_layer)),
- patches_resolution[1] // (2 ** (self.num_layers-1-i_layer))), dim=int(embed_dim * 2 ** (self.num_layers-1-i_layer)), dim_scale=2, norm_layer=norm_layer)
- else:
- layer_up = BasicLayer_up(dim=int(embed_dim * 2 ** (self.num_layers-1-i_layer)),
- input_resolution=(patches_resolution[0] // (2 ** (self.num_layers-1-i_layer)),
- patches_resolution[1] // (2 ** (self.num_layers-1-i_layer))),
- depth=depths[(self.num_layers-1-i_layer)],
- num_heads=num_heads[(self.num_layers-1-i_layer)],
- window_size=window_size,
- mlp_ratio=self.mlp_ratio,
- qkv_bias=qkv_bias, qk_scale=qk_scale,
- drop=drop_rate, attn_drop=attn_drop_rate,
- drop_path=dpr[sum(depths[:(self.num_layers-1-i_layer)]):sum(depths[:(self.num_layers-1-i_layer) + 1])],
- norm_layer=norm_layer,
- upsample=PatchExpand if (i_layer < self.num_layers - 1) else None,
- use_checkpoint=use_checkpoint)
- self.layers_up.append(layer_up)
- self.concat_back_dim.append(concat_linear)
-
- self.norm = norm_layer(self.num_features)
- self.norm_up= norm_layer(self.embed_dim)
-
- if self.final_upsample == "expand_first":
- print("---final upsample expand_first---")
- self.up = FinalPatchExpand_X4(input_resolution=(img_size//patch_size,img_size//patch_size),dim_scale=4,dim=embed_dim)
- self.output = nn.Conv2d(in_channels=embed_dim,out_channels=self.num_classes,kernel_size=1,bias=False)
-
- self.apply(self._init_weights)
-
- def _init_weights(self, m):
- if isinstance(m, nn.Linear):
- trunc_normal_(m.weight, std=.02)
- if isinstance(m, nn.Linear) and m.bias is not None:
- nn.init.constant_(m.bias, 0)
- elif isinstance(m, nn.LayerNorm):
- nn.init.constant_(m.bias, 0)
- nn.init.constant_(m.weight, 1.0)
-
- @torch.jit.ignore
- def no_weight_decay(self):
- return {'absolute_pos_embed'}
-
- @torch.jit.ignore
- def no_weight_decay_keywords(self):
- return {'relative_position_bias_table'}
-
- #Encoder and Bottleneck
- def forward_features(self, x):
- x = self.patch_embed(x)
- if self.ape:
- x = x + self.absolute_pos_embed
- x = self.pos_drop(x)
- x_downsample = []
-
- for layer in self.layers:
- x_downsample.append(x)
- x = layer(x)
-
- x = self.norm(x) # B L C
-
- return x, x_downsample
-
- #Dencoder and Skip connection
- def forward_up_features(self, x, x_downsample):
- for inx, layer_up in enumerate(self.layers_up):
- if inx == 0:
- x = layer_up(x)
- else:
- x = torch.cat([x,x_downsample[3-inx]],-1)
- x = self.concat_back_dim[inx](x)
- x = layer_up(x)
-
- x = self.norm_up(x) # B L C
-
- return x
-
- def up_x4(self, x):
- H, W = self.patches_resolution
- B, L, C = x.shape
- assert L == H*W, "input features has wrong size"
-
- if self.final_upsample=="expand_first":
- x = self.up(x)
- x = x.view(B,4*H,4*W,-1)
- x = x.permute(0,3,1,2) #B,C,H,W
- x = self.output(x)
-
- return x
-
- def forward(self, x):
- x, x_downsample = self.forward_features(x)
- x = self.forward_up_features(x,x_downsample)
- x = self.up_x4(x)
-
- return x
-
- def flops(self):
- flops = 0
- flops += self.patch_embed.flops()
- for i, layer in enumerate(self.layers):
- flops += layer.flops()
- flops += self.num_features * self.patches_resolution[0] * self.patches_resolution[1] // (2 ** self.num_layers)
- flops += self.num_features * self.num_classes
- return
\ No newline at end of file
diff --git a/pymic/net/net2d/trans2d/transunet.py b/pymic/net/net2d/trans2d/transunet.py
deleted file mode 100644
index 9db5d2d..0000000
--- a/pymic/net/net2d/trans2d/transunet.py
+++ /dev/null
@@ -1,491 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-code adapted from: https://github.com/Beckschen/TransUNet
-"""
-from __future__ import print_function, division
-
-import copy
-# import logging
-import math
-import torch
-import torch.nn as nn
-from torch.nn import Dropout, Softmax, Linear, Conv2d, LayerNorm
-from torch.nn.modules.utils import _pair
-
-import numpy as np
-from scipy import ndimage
-from os.path import join as pjoin
-import pymic.net.net2d.trans2d.transunet_cfg as configs
-from pymic.net.net2d.trans2d.transunet_resnet import ResNetV2
-
-
-VIT_CONFIGS = {
- 'ViT-B_16': configs.get_b16_config(),
- 'ViT-B_32': configs.get_b32_config(),
- 'ViT-L_16': configs.get_l16_config(),
- 'ViT-L_32': configs.get_l32_config(),
- 'ViT-H_14': configs.get_h14_config(),
- 'R50-ViT-B_16': configs.get_r50_b16_config(),
- 'R50-ViT-L_16': configs.get_r50_l16_config(),
- 'testing': configs.get_testing(),
-}
-
-ATTENTION_Q = "MultiHeadDotProductAttention_1/query"
-ATTENTION_K = "MultiHeadDotProductAttention_1/key"
-ATTENTION_V = "MultiHeadDotProductAttention_1/value"
-ATTENTION_OUT = "MultiHeadDotProductAttention_1/out"
-FC_0 = "MlpBlock_3/Dense_0"
-FC_1 = "MlpBlock_3/Dense_1"
-ATTENTION_NORM = "LayerNorm_0"
-MLP_NORM = "LayerNorm_2"
-
-
-def np2th(weights, conv=False):
- """Possibly convert HWIO to OIHW."""
- if conv:
- weights = weights.transpose([3, 2, 0, 1])
- return torch.from_numpy(weights)
-
-
-def swish(x):
- return x * torch.sigmoid(x)
-
-
-ACT2FN = {"gelu": torch.nn.functional.gelu, "relu": torch.nn.functional.relu, "swish": swish}
-
-class Attention(nn.Module):
- def __init__(self, config, vis):
- super(Attention, self).__init__()
- self.vis = vis
- self.num_attention_heads = config.transformer["num_heads"]
- self.attention_head_size = int(config.hidden_size / self.num_attention_heads)
- self.all_head_size = self.num_attention_heads * self.attention_head_size
-
- self.query = Linear(config.hidden_size, self.all_head_size)
- self.key = Linear(config.hidden_size, self.all_head_size)
- self.value = Linear(config.hidden_size, self.all_head_size)
-
- self.out = Linear(config.hidden_size, config.hidden_size)
- self.attn_dropout = Dropout(config.transformer["attention_dropout_rate"])
- self.proj_dropout = Dropout(config.transformer["attention_dropout_rate"])
-
- self.softmax = Softmax(dim=-1)
-
- def transpose_for_scores(self, x):
- new_x_shape = x.size()[:-1] + (self.num_attention_heads, self.attention_head_size)
- x = x.view(*new_x_shape)
- return x.permute(0, 2, 1, 3)
-
- def forward(self, hidden_states):
- mixed_query_layer = self.query(hidden_states)
- mixed_key_layer = self.key(hidden_states)
- mixed_value_layer = self.value(hidden_states)
-
- query_layer = self.transpose_for_scores(mixed_query_layer)
- key_layer = self.transpose_for_scores(mixed_key_layer)
- value_layer = self.transpose_for_scores(mixed_value_layer)
-
- attention_scores = torch.matmul(query_layer, key_layer.transpose(-1, -2))
- attention_scores = attention_scores / math.sqrt(self.attention_head_size)
- attention_probs = self.softmax(attention_scores)
- weights = attention_probs if self.vis else None
- attention_probs = self.attn_dropout(attention_probs)
-
- context_layer = torch.matmul(attention_probs, value_layer)
- context_layer = context_layer.permute(0, 2, 1, 3).contiguous()
- new_context_layer_shape = context_layer.size()[:-2] + (self.all_head_size,)
- context_layer = context_layer.view(*new_context_layer_shape)
- attention_output = self.out(context_layer)
- attention_output = self.proj_dropout(attention_output)
- return attention_output, weights
-
-class Mlp(nn.Module):
- def __init__(self, config):
- super(Mlp, self).__init__()
- self.fc1 = Linear(config.hidden_size, config.transformer["mlp_dim"])
- self.fc2 = Linear(config.transformer["mlp_dim"], config.hidden_size)
- self.act_fn = ACT2FN["gelu"]
- self.dropout = Dropout(config.transformer["dropout_rate"])
-
- self._init_weights()
-
- def _init_weights(self):
- nn.init.xavier_uniform_(self.fc1.weight)
- nn.init.xavier_uniform_(self.fc2.weight)
- nn.init.normal_(self.fc1.bias, std=1e-6)
- nn.init.normal_(self.fc2.bias, std=1e-6)
-
- def forward(self, x):
- x = self.fc1(x)
- x = self.act_fn(x)
- x = self.dropout(x)
- x = self.fc2(x)
- x = self.dropout(x)
- return x
-
-class Embeddings(nn.Module):
- """Construct the embeddings from patch, position embeddings.
- """
- def __init__(self, config, img_size, in_channels=3):
- super(Embeddings, self).__init__()
- self.hybrid = None
- self.config = config
- img_size = _pair(img_size)
-
- if config.patches.get("grid") is not None: # ResNet
- grid_size = config.patches["grid"]
- patch_size = (img_size[0] // 16 // grid_size[0], img_size[1] // 16 // grid_size[1])
- patch_size_real = (patch_size[0] * 16, patch_size[1] * 16)
- n_patches = (img_size[0] // patch_size_real[0]) * (img_size[1] // patch_size_real[1])
- self.hybrid = True
- else:
- patch_size = _pair(config.patches["size"])
- n_patches = (img_size[0] // patch_size[0]) * (img_size[1] // patch_size[1])
- self.hybrid = False
-
- if self.hybrid:
- self.hybrid_model = ResNetV2(block_units=config.resnet.num_layers, width_factor=config.resnet.width_factor)
- in_channels = self.hybrid_model.width * 16
- self.patch_embeddings = Conv2d(in_channels=in_channels,
- out_channels=config.hidden_size,
- kernel_size=patch_size,
- stride=patch_size)
- self.position_embeddings = nn.Parameter(torch.zeros(1, n_patches, config.hidden_size))
-
- self.dropout = Dropout(config.transformer["dropout_rate"])
-
-
- def forward(self, x):
- if self.hybrid:
- x, features = self.hybrid_model(x)
- else:
- features = None
- x = self.patch_embeddings(x) # (B, hidden. n_patches^(1/2), n_patches^(1/2))
- x = x.flatten(2)
- x = x.transpose(-1, -2) # (B, n_patches, hidden)
-
- embeddings = x + self.position_embeddings
- embeddings = self.dropout(embeddings)
- return embeddings, features
-
-class Block(nn.Module):
- def __init__(self, config, vis):
- super(Block, self).__init__()
- self.hidden_size = config.hidden_size
- self.attention_norm = LayerNorm(config.hidden_size, eps=1e-6)
- self.ffn_norm = LayerNorm(config.hidden_size, eps=1e-6)
- self.ffn = Mlp(config)
- self.attn = Attention(config, vis)
-
- def forward(self, x):
- h = x
- x = self.attention_norm(x)
- x, weights = self.attn(x)
- x = x + h
-
- h = x
- x = self.ffn_norm(x)
- x = self.ffn(x)
- x = x + h
- return x, weights
-
- def load_from(self, weights, n_block):
- ROOT = f"Transformer/encoderblock_{n_block}"
- with torch.no_grad():
- query_weight = np2th(weights[pjoin(ROOT, ATTENTION_Q, "kernel")]).view(self.hidden_size, self.hidden_size).t()
- key_weight = np2th(weights[pjoin(ROOT, ATTENTION_K, "kernel")]).view(self.hidden_size, self.hidden_size).t()
- value_weight = np2th(weights[pjoin(ROOT, ATTENTION_V, "kernel")]).view(self.hidden_size, self.hidden_size).t()
- out_weight = np2th(weights[pjoin(ROOT, ATTENTION_OUT, "kernel")]).view(self.hidden_size, self.hidden_size).t()
-
- query_bias = np2th(weights[pjoin(ROOT, ATTENTION_Q, "bias")]).view(-1)
- key_bias = np2th(weights[pjoin(ROOT, ATTENTION_K, "bias")]).view(-1)
- value_bias = np2th(weights[pjoin(ROOT, ATTENTION_V, "bias")]).view(-1)
- out_bias = np2th(weights[pjoin(ROOT, ATTENTION_OUT, "bias")]).view(-1)
-
- self.attn.query.weight.copy_(query_weight)
- self.attn.key.weight.copy_(key_weight)
- self.attn.value.weight.copy_(value_weight)
- self.attn.out.weight.copy_(out_weight)
- self.attn.query.bias.copy_(query_bias)
- self.attn.key.bias.copy_(key_bias)
- self.attn.value.bias.copy_(value_bias)
- self.attn.out.bias.copy_(out_bias)
-
- mlp_weight_0 = np2th(weights[pjoin(ROOT, FC_0, "kernel")]).t()
- mlp_weight_1 = np2th(weights[pjoin(ROOT, FC_1, "kernel")]).t()
- mlp_bias_0 = np2th(weights[pjoin(ROOT, FC_0, "bias")]).t()
- mlp_bias_1 = np2th(weights[pjoin(ROOT, FC_1, "bias")]).t()
-
- self.ffn.fc1.weight.copy_(mlp_weight_0)
- self.ffn.fc2.weight.copy_(mlp_weight_1)
- self.ffn.fc1.bias.copy_(mlp_bias_0)
- self.ffn.fc2.bias.copy_(mlp_bias_1)
-
- self.attention_norm.weight.copy_(np2th(weights[pjoin(ROOT, ATTENTION_NORM, "scale")]))
- self.attention_norm.bias.copy_(np2th(weights[pjoin(ROOT, ATTENTION_NORM, "bias")]))
- self.ffn_norm.weight.copy_(np2th(weights[pjoin(ROOT, MLP_NORM, "scale")]))
- self.ffn_norm.bias.copy_(np2th(weights[pjoin(ROOT, MLP_NORM, "bias")]))
-
-class Encoder(nn.Module):
- def __init__(self, config, vis):
- super(Encoder, self).__init__()
- self.vis = vis
- self.layer = nn.ModuleList()
- self.encoder_norm = LayerNorm(config.hidden_size, eps=1e-6)
- for _ in range(config.transformer["num_layers"]):
- layer = Block(config, vis)
- self.layer.append(copy.deepcopy(layer))
-
- def forward(self, hidden_states):
- attn_weights = []
- for layer_block in self.layer:
- hidden_states, weights = layer_block(hidden_states)
- if self.vis:
- attn_weights.append(weights)
- encoded = self.encoder_norm(hidden_states)
- return encoded, attn_weights
-
-class Transformer(nn.Module):
- def __init__(self, config, img_size, vis):
- super(Transformer, self).__init__()
- self.embeddings = Embeddings(config, img_size=img_size)
- self.encoder = Encoder(config, vis)
-
- def forward(self, input_ids):
- embedding_output, features = self.embeddings(input_ids)
- encoded, attn_weights = self.encoder(embedding_output) # (B, n_patch, hidden)
- return encoded, attn_weights, features
-
-class Conv2dReLU(nn.Sequential):
- def __init__(
- self,
- in_channels,
- out_channels,
- kernel_size,
- padding=0,
- stride=1,
- use_batchnorm=True,
- ):
- conv = nn.Conv2d(
- in_channels,
- out_channels,
- kernel_size,
- stride=stride,
- padding=padding,
- bias=not (use_batchnorm),
- )
- relu = nn.ReLU(inplace=True)
-
- bn = nn.BatchNorm2d(out_channels)
-
- super(Conv2dReLU, self).__init__(conv, bn, relu)
-
-
-class DecoderBlock(nn.Module):
- def __init__(
- self,
- in_channels,
- out_channels,
- skip_channels=0,
- use_batchnorm=True,
- ):
- super().__init__()
- self.conv1 = Conv2dReLU(
- in_channels + skip_channels,
- out_channels,
- kernel_size=3,
- padding=1,
- use_batchnorm=use_batchnorm,
- )
- self.conv2 = Conv2dReLU(
- out_channels,
- out_channels,
- kernel_size=3,
- padding=1,
- use_batchnorm=use_batchnorm,
- )
- self.up = nn.UpsamplingBilinear2d(scale_factor=2)
-
- def forward(self, x, skip=None):
- x = self.up(x)
- if skip is not None:
- x = torch.cat([x, skip], dim=1)
- x = self.conv1(x)
- x = self.conv2(x)
- return x
-
-
-class SegmentationHead(nn.Sequential):
-
- def __init__(self, in_channels, out_channels, kernel_size=3, upsampling=1):
- conv2d = nn.Conv2d(in_channels, out_channels, kernel_size=kernel_size, padding=kernel_size // 2)
- upsampling = nn.UpsamplingBilinear2d(scale_factor=upsampling) if upsampling > 1 else nn.Identity()
- super().__init__(conv2d, upsampling)
-
-
-class DecoderCup(nn.Module):
- def __init__(self, config):
- super().__init__()
- self.config = config
- head_channels = 512
- self.conv_more = Conv2dReLU(
- config.hidden_size,
- head_channels,
- kernel_size=3,
- padding=1,
- use_batchnorm=True,
- )
- decoder_channels = config.decoder_channels
- in_channels = [head_channels] + list(decoder_channels[:-1])
- out_channels = decoder_channels
-
- if self.config.n_skip != 0:
- skip_channels = self.config.skip_channels
- for i in range(4-self.config.n_skip): # re-select the skip channels according to n_skip
- skip_channels[3-i]=0
-
- else:
- skip_channels=[0,0,0,0]
-
- blocks = [
- DecoderBlock(in_ch, out_ch, sk_ch) for in_ch, out_ch, sk_ch in zip(in_channels, out_channels, skip_channels)
- ]
- self.blocks = nn.ModuleList(blocks)
-
- def forward(self, hidden_states, features=None):
- B, n_patch, hidden = hidden_states.size() # reshape from (B, n_patch, hidden) to (B, h, w, hidden)
- h, w = int(np.sqrt(n_patch)), int(np.sqrt(n_patch))
- x = hidden_states.permute(0, 2, 1)
- x = x.contiguous().view(B, hidden, h, w)
- x = self.conv_more(x)
- for i, decoder_block in enumerate(self.blocks):
- if features is not None:
- skip = features[i] if (i < self.config.n_skip) else None
- else:
- skip = None
- x = decoder_block(x, skip=skip)
- return x
-
-class TransUNet(nn.Module):
- """
- Implementatin of TransUNet.
-
- * Reference: Jieneng Chen, Yongyi Lu et al:
- TransUNet: Transformers Make Strong Encoders for Medical Image Segmentation.
- `Arxiv 2021. `_
-
- Note that the input channel can only be 1 or 3, and the input image size should be 256x256.
- Parameters are given in the `params` dictionary, and should include the
- following fields:
-
- :param img_size: (tuple) The input image size, should be [256, 256].
- :param class_num: (int) The class number for segmentation task.
- :param vit_name: (string) The name for vit backbone. It can be one of the following: 'ViT-B_16',
- 'ViT-B_32','ViT-L_16', 'ViT-L_32', 'ViT-H_14'. 'R50-ViT-B_16', 'R50-ViT-L_16'.
- By default, it is 'R50-ViT-B_16'.
- """
- def __init__(self, params):
- super(TransUNet, self).__init__()
- vit_name = params.get("vit_name", 'R50-ViT-B_16')
- img_size = params['img_size']
- vis = params.get("vis", False)
- self.config = VIT_CONFIGS[vit_name]
- self.num_classes = params['class_num']
- self.zero_head = params.get("zero_head", False)
-
- self.classifier = self.config.classifier
- self.transformer = Transformer(self.config, img_size, vis)
- self.decoder = DecoderCup(self.config)
- self.segmentation_head = SegmentationHead(
- in_channels=self.config['decoder_channels'][-1],
- out_channels=self.num_classes,
- kernel_size=3,
- )
-
- def forward(self, x):
- x_shape = list(x.shape)
- if(len(x_shape) == 5):
- [N, C, D, H, W] = x_shape
- new_shape = [N*D, C, H, W]
- x = torch.transpose(x, 1, 2)
- x = torch.reshape(x, new_shape)
-
- if x.size()[1] == 1:
- x = x.repeat(1,3,1,1)
- elif(x.size()[1] !=3):
- raise ValueError("The input channel number should be 1 or 3 for TransUNet")
- x, attn_weights, features = self.transformer(x) # (B, n_patch, hidden)
- x = self.decoder(x, features)
- logits = self.segmentation_head(x)
-
- if(len(x_shape) == 5):
- new_shape = [N, D] + list(logits.shape)[1:]
- logits = torch.reshape(logits, new_shape)
- logits = torch.transpose(logits, 1, 2)
-
- return logits
-
- def load_from(self, weights):
- with torch.no_grad():
-
- res_weight = weights
- self.transformer.embeddings.patch_embeddings.weight.copy_(np2th(weights["embedding/kernel"], conv=True))
- self.transformer.embeddings.patch_embeddings.bias.copy_(np2th(weights["embedding/bias"]))
-
- self.transformer.encoder.encoder_norm.weight.copy_(np2th(weights["Transformer/encoder_norm/scale"]))
- self.transformer.encoder.encoder_norm.bias.copy_(np2th(weights["Transformer/encoder_norm/bias"]))
-
- posemb = np2th(weights["Transformer/posembed_input/pos_embedding"])
-
- posemb_new = self.transformer.embeddings.position_embeddings
- if posemb.size() == posemb_new.size():
- self.transformer.embeddings.position_embeddings.copy_(posemb)
- elif posemb.size()[1]-1 == posemb_new.size()[1]:
- posemb = posemb[:, 1:]
- self.transformer.embeddings.position_embeddings.copy_(posemb)
- else:
- # logger.info("load_pretrained: resized variant: %s to %s" % (posemb.size(), posemb_new.size()))
- ntok_new = posemb_new.size(1)
- if self.classifier == "seg":
- _, posemb_grid = posemb[:, :1], posemb[0, 1:]
- gs_old = int(np.sqrt(len(posemb_grid)))
- gs_new = int(np.sqrt(ntok_new))
- print('load_pretrained: grid-size from %s to %s' % (gs_old, gs_new))
- posemb_grid = posemb_grid.reshape(gs_old, gs_old, -1)
- zoom = (gs_new / gs_old, gs_new / gs_old, 1)
- posemb_grid = ndimage.zoom(posemb_grid, zoom, order=1) # th2np
- posemb_grid = posemb_grid.reshape(1, gs_new * gs_new, -1)
- posemb = posemb_grid
- self.transformer.embeddings.position_embeddings.copy_(np2th(posemb))
-
- # Encoder whole
- for bname, block in self.transformer.encoder.named_children():
- for uname, unit in block.named_children():
- unit.load_from(weights, n_block=uname)
-
- if self.transformer.embeddings.hybrid:
- self.transformer.embeddings.hybrid_model.root.conv.weight.copy_(np2th(res_weight["conv_root/kernel"], conv=True))
- gn_weight = np2th(res_weight["gn_root/scale"]).view(-1)
- gn_bias = np2th(res_weight["gn_root/bias"]).view(-1)
- self.transformer.embeddings.hybrid_model.root.gn.weight.copy_(gn_weight)
- self.transformer.embeddings.hybrid_model.root.gn.bias.copy_(gn_bias)
-
- for bname, block in self.transformer.embeddings.hybrid_model.body.named_children():
- for uname, unit in block.named_children():
- unit.load_from(res_weight, n_block=bname, n_unit=uname)
-
-if __name__ == "__main__":
- params = {'img_size': [256, 256],
- 'class_num': 2}
- net = TransUNet(params)
- net.double()
-
- for c in [1,3]:
- x = np.random.rand(4, c, 256, 256)
- xt = torch.from_numpy(x)
- xt = torch.tensor(xt)
-
- y = net(xt)
- print(len(y.size()))
- y = y.detach().numpy()
- print(y.shape)
\ No newline at end of file
diff --git a/pymic/net/net2d/trans2d/transunet_cfg.py b/pymic/net/net2d/trans2d/transunet_cfg.py
deleted file mode 100644
index aab62d4..0000000
--- a/pymic/net/net2d/trans2d/transunet_cfg.py
+++ /dev/null
@@ -1,135 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-"""
-code adapted from: https://github.com/Beckschen/TransUNet
-"""
-import ml_collections
-
-def get_b16_config():
- """Returns the ViT-B/16 configuration."""
- config = ml_collections.ConfigDict()
- config.patches = ml_collections.ConfigDict({'size': (16, 16)})
- config.hidden_size = 768
- config.transformer = ml_collections.ConfigDict()
- config.transformer.mlp_dim = 3072
- config.transformer.num_heads = 12
- config.transformer.num_layers = 12
- config.transformer.attention_dropout_rate = 0.0
- config.transformer.dropout_rate = 0.1
-
- config.classifier = 'seg'
- config.representation_size = None
- config.resnet_pretrained_path = None
- config.pretrained_path = '../model/vit_checkpoint/imagenet21k/ViT-B_16.npz'
- config.patch_size = 16
-
- config.decoder_channels = (256, 128, 64, 16)
- config.n_classes = 2
- config.activation = 'softmax'
- return config
-
-
-def get_testing():
- """Returns a minimal configuration for testing."""
- config = ml_collections.ConfigDict()
- config.patches = ml_collections.ConfigDict({'size': (16, 16)})
- config.hidden_size = 1
- config.transformer = ml_collections.ConfigDict()
- config.transformer.mlp_dim = 1
- config.transformer.num_heads = 1
- config.transformer.num_layers = 1
- config.transformer.attention_dropout_rate = 0.0
- config.transformer.dropout_rate = 0.1
- config.classifier = 'token'
- config.representation_size = None
- return config
-
-def get_r50_b16_config():
- """Returns the Resnet50 + ViT-B/16 configuration."""
- config = get_b16_config()
- config.patches.grid = (16, 16)
- config.resnet = ml_collections.ConfigDict()
- config.resnet.num_layers = (3, 4, 9)
- config.resnet.width_factor = 1
-
- config.classifier = 'seg'
- config.pretrained_path = '../model/vit_checkpoint/imagenet21k/R50+ViT-B_16.npz'
- config.decoder_channels = (256, 128, 64, 16)
- config.skip_channels = [512, 256, 64, 16]
- config.n_classes = 2
- config.n_skip = 3
- config.activation = 'softmax'
-
- return config
-
-
-def get_b32_config():
- """Returns the ViT-B/32 configuration."""
- config = get_b16_config()
- config.patches.size = (32, 32)
- config.pretrained_path = '../model/vit_checkpoint/imagenet21k/ViT-B_32.npz'
- return config
-
-
-def get_l16_config():
- """Returns the ViT-L/16 configuration."""
- config = ml_collections.ConfigDict()
- config.patches = ml_collections.ConfigDict({'size': (16, 16)})
- config.hidden_size = 1024
- config.transformer = ml_collections.ConfigDict()
- config.transformer.mlp_dim = 4096
- config.transformer.num_heads = 16
- config.transformer.num_layers = 24
- config.transformer.attention_dropout_rate = 0.0
- config.transformer.dropout_rate = 0.1
- config.representation_size = None
-
- # custom
- config.classifier = 'seg'
- config.resnet_pretrained_path = None
- config.pretrained_path = '../model/vit_checkpoint/imagenet21k/ViT-L_16.npz'
- config.decoder_channels = (256, 128, 64, 16)
- config.n_classes = 2
- config.activation = 'softmax'
- return config
-
-
-def get_r50_l16_config():
- """Returns the Resnet50 + ViT-L/16 configuration. customized """
- config = get_l16_config()
- config.patches.grid = (16, 16)
- config.resnet = ml_collections.ConfigDict()
- config.resnet.num_layers = (3, 4, 9)
- config.resnet.width_factor = 1
-
- config.classifier = 'seg'
- config.resnet_pretrained_path = '../model/vit_checkpoint/imagenet21k/R50+ViT-B_16.npz'
- config.decoder_channels = (256, 128, 64, 16)
- config.skip_channels = [512, 256, 64, 16]
- config.n_classes = 2
- config.activation = 'softmax'
- return config
-
-
-def get_l32_config():
- """Returns the ViT-L/32 configuration."""
- config = get_l16_config()
- config.patches.size = (32, 32)
- return config
-
-
-def get_h14_config():
- """Returns the ViT-L/16 configuration."""
- config = ml_collections.ConfigDict()
- config.patches = ml_collections.ConfigDict({'size': (14, 14)})
- config.hidden_size = 1280
- config.transformer = ml_collections.ConfigDict()
- config.transformer.mlp_dim = 5120
- config.transformer.num_heads = 16
- config.transformer.num_layers = 32
- config.transformer.attention_dropout_rate = 0.0
- config.transformer.dropout_rate = 0.1
- config.classifier = 'token'
- config.representation_size = None
-
- return config
\ No newline at end of file
diff --git a/pymic/net/net2d/trans2d/transunet_resnet.py b/pymic/net/net2d/trans2d/transunet_resnet.py
deleted file mode 100644
index 144a268..0000000
--- a/pymic/net/net2d/trans2d/transunet_resnet.py
+++ /dev/null
@@ -1,164 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-code adapted from: https://github.com/Beckschen/TransUNet
-"""
-from __future__ import print_function, division
-
-from os.path import join as pjoin
-from collections import OrderedDict
-
-import torch
-import torch.nn as nn
-import torch.nn.functional as F
-
-
-def np2th(weights, conv=False):
- """Possibly convert HWIO to OIHW."""
- if conv:
- weights = weights.transpose([3, 2, 0, 1])
- return torch.from_numpy(weights)
-
-
-class StdConv2d(nn.Conv2d):
-
- def forward(self, x):
- w = self.weight
- v, m = torch.var_mean(w, dim=[1, 2, 3], keepdim=True, unbiased=False)
- w = (w - m) / torch.sqrt(v + 1e-5)
- return F.conv2d(x, w, self.bias, self.stride, self.padding,
- self.dilation, self.groups)
-
-
-def conv3x3(cin, cout, stride=1, groups=1, bias=False):
- return StdConv2d(cin, cout, kernel_size=3, stride=stride,
- padding=1, bias=bias, groups=groups)
-
-
-def conv1x1(cin, cout, stride=1, bias=False):
- return StdConv2d(cin, cout, kernel_size=1, stride=stride,
- padding=0, bias=bias)
-
-
-class PreActBottleneck(nn.Module):
- """Pre-activation (v2) bottleneck block.
- """
-
- def __init__(self, cin, cout=None, cmid=None, stride=1):
- super().__init__()
- cout = cout or cin
- cmid = cmid or cout//4
-
- self.gn1 = nn.GroupNorm(32, cmid, eps=1e-6)
- self.conv1 = conv1x1(cin, cmid, bias=False)
- self.gn2 = nn.GroupNorm(32, cmid, eps=1e-6)
- self.conv2 = conv3x3(cmid, cmid, stride, bias=False) # Original code has it on conv1!!
- self.gn3 = nn.GroupNorm(32, cout, eps=1e-6)
- self.conv3 = conv1x1(cmid, cout, bias=False)
- self.relu = nn.ReLU(inplace=True)
-
- if (stride != 1 or cin != cout):
- # Projection also with pre-activation according to paper.
- self.downsample = conv1x1(cin, cout, stride, bias=False)
- self.gn_proj = nn.GroupNorm(cout, cout)
-
- def forward(self, x):
-
- # Residual branch
- residual = x
- if hasattr(self, 'downsample'):
- residual = self.downsample(x)
- residual = self.gn_proj(residual)
-
- # Unit's branch
- y = self.relu(self.gn1(self.conv1(x)))
- y = self.relu(self.gn2(self.conv2(y)))
- y = self.gn3(self.conv3(y))
-
- y = self.relu(residual + y)
- return y
-
- def load_from(self, weights, n_block, n_unit):
- conv1_weight = np2th(weights[pjoin(n_block, n_unit, "conv1/kernel")], conv=True)
- conv2_weight = np2th(weights[pjoin(n_block, n_unit, "conv2/kernel")], conv=True)
- conv3_weight = np2th(weights[pjoin(n_block, n_unit, "conv3/kernel")], conv=True)
-
- gn1_weight = np2th(weights[pjoin(n_block, n_unit, "gn1/scale")])
- gn1_bias = np2th(weights[pjoin(n_block, n_unit, "gn1/bias")])
-
- gn2_weight = np2th(weights[pjoin(n_block, n_unit, "gn2/scale")])
- gn2_bias = np2th(weights[pjoin(n_block, n_unit, "gn2/bias")])
-
- gn3_weight = np2th(weights[pjoin(n_block, n_unit, "gn3/scale")])
- gn3_bias = np2th(weights[pjoin(n_block, n_unit, "gn3/bias")])
-
- self.conv1.weight.copy_(conv1_weight)
- self.conv2.weight.copy_(conv2_weight)
- self.conv3.weight.copy_(conv3_weight)
-
- self.gn1.weight.copy_(gn1_weight.view(-1))
- self.gn1.bias.copy_(gn1_bias.view(-1))
-
- self.gn2.weight.copy_(gn2_weight.view(-1))
- self.gn2.bias.copy_(gn2_bias.view(-1))
-
- self.gn3.weight.copy_(gn3_weight.view(-1))
- self.gn3.bias.copy_(gn3_bias.view(-1))
-
- if hasattr(self, 'downsample'):
- proj_conv_weight = np2th(weights[pjoin(n_block, n_unit, "conv_proj/kernel")], conv=True)
- proj_gn_weight = np2th(weights[pjoin(n_block, n_unit, "gn_proj/scale")])
- proj_gn_bias = np2th(weights[pjoin(n_block, n_unit, "gn_proj/bias")])
-
- self.downsample.weight.copy_(proj_conv_weight)
- self.gn_proj.weight.copy_(proj_gn_weight.view(-1))
- self.gn_proj.bias.copy_(proj_gn_bias.view(-1))
-
-class ResNetV2(nn.Module):
- """Implementation of Pre-activation (v2) ResNet mode."""
-
- def __init__(self, block_units, width_factor):
- super().__init__()
- width = int(64 * width_factor)
- self.width = width
-
- self.root = nn.Sequential(OrderedDict([
- ('conv', StdConv2d(3, width, kernel_size=7, stride=2, bias=False, padding=3)),
- ('gn', nn.GroupNorm(32, width, eps=1e-6)),
- ('relu', nn.ReLU(inplace=True)),
- # ('pool', nn.MaxPool2d(kernel_size=3, stride=2, padding=0))
- ]))
-
- self.body = nn.Sequential(OrderedDict([
- ('block1', nn.Sequential(OrderedDict(
- [('unit1', PreActBottleneck(cin=width, cout=width*4, cmid=width))] +
- [(f'unit{i:d}', PreActBottleneck(cin=width*4, cout=width*4, cmid=width)) for i in range(2, block_units[0] + 1)],
- ))),
- ('block2', nn.Sequential(OrderedDict(
- [('unit1', PreActBottleneck(cin=width*4, cout=width*8, cmid=width*2, stride=2))] +
- [(f'unit{i:d}', PreActBottleneck(cin=width*8, cout=width*8, cmid=width*2)) for i in range(2, block_units[1] + 1)],
- ))),
- ('block3', nn.Sequential(OrderedDict(
- [('unit1', PreActBottleneck(cin=width*8, cout=width*16, cmid=width*4, stride=2))] +
- [(f'unit{i:d}', PreActBottleneck(cin=width*16, cout=width*16, cmid=width*4)) for i in range(2, block_units[2] + 1)],
- ))),
- ]))
-
- def forward(self, x):
- features = []
- b, c, in_size, _ = x.size()
- x = self.root(x)
- features.append(x)
- x = nn.MaxPool2d(kernel_size=3, stride=2, padding=0)(x)
- for i in range(len(self.body)-1):
- x = self.body[i](x)
- right_size = int(in_size / 4 / (i+1))
- if x.size()[2] != right_size:
- pad = right_size - x.size()[2]
- assert pad < 3 and pad > 0, "x {} should {}".format(x.size(), right_size)
- feat = torch.zeros((b, x.size()[1], right_size, right_size), device=x.device)
- feat[:, :, 0:x.size()[2], 0:x.size()[3]] = x[:]
- else:
- feat = x
- features.append(feat)
- x = self.body[-1](x)
- return x, features[::-1]
\ No newline at end of file
diff --git a/pymic/net/net2d/umamba.py b/pymic/net/net2d/umamba.py
deleted file mode 100644
index 63ccacf..0000000
--- a/pymic/net/net2d/umamba.py
+++ /dev/null
@@ -1,1234 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-
-import logging
-import numpy as np
-import math
-import torch
-from torch import nn
-from torch.nn import functional as F
-from typing import Union, Type, List, Tuple
-
-from torch.nn.modules.conv import _ConvNd
-from torch.nn.modules.dropout import _DropoutNd
-from mamba_ssm import Mamba
-from torch.cuda.amp import autocast
-
-# from dynamic_network_architectures.building_blocks.helper import convert_conv_op_to_dim
-# from nnunetv2.utilities.plans_handling.plans_handler import ConfigurationManager, PlansManager
-# from dynamic_network_architectures.building_blocks.helper import get_matching_instancenorm, convert_dim_to_conv_op
-# from nnunetv2.utilities.network_initialization import InitWeights_He
-# from dynamic_network_architectures.building_blocks.helper import maybe_convert_scalar_to_list, get_matching_pool_op
-
-def dim_of_conv_op(conv_op: Type[_ConvNd]) -> int:
- """
- :param conv_op: conv class
- :return: dimension: 1, 2 or 3
- """
- if conv_op == nn.Conv1d:
- return 1
- elif conv_op == nn.Conv2d:
- return 2
- elif conv_op == nn.Conv3d:
- return 3
- else:
- raise ValueError("Unknown dimension. Only 1d 2d and 3d conv are supported. got %s" % str(conv_op))
-
-def get_matching_pool_op(conv_op: Type[_ConvNd] = None,
- dimension: int = None,
- adaptive=False,
- pool_type: str = 'avg') -> Type[torch.nn.Module]:
- """
- You MUST set EITHER conv_op OR dimension. Do not set both!
- :param conv_op:
- :param dimension:
- :param adaptive:
- :param pool_type: either 'avg' or 'max'
- :return:
- """
- assert not ((conv_op is not None) and (dimension is not None)), \
- "You MUST set EITHER conv_op OR dimension. Do not set both!"
- assert pool_type in ['avg', 'max'], 'pool_type must be either avg or max'
- if conv_op is not None:
- dimension = dim_of_conv_op(conv_op)
- assert dimension in [1, 2, 3], 'Dimension must be 1, 2 or 3'
-
- if conv_op is not None:
- dimension = dim_of_conv_op(conv_op)
-
- if dimension == 1:
- if pool_type == 'avg':
- if adaptive:
- return nn.AdaptiveAvgPool1d
- else:
- return nn.AvgPool1d
- elif pool_type == 'max':
- if adaptive:
- return nn.AdaptiveMaxPool1d
- else:
- return nn.MaxPool1d
- elif dimension == 2:
- if pool_type == 'avg':
- if adaptive:
- return nn.AdaptiveAvgPool2d
- else:
- return nn.AvgPool2d
- elif pool_type == 'max':
- if adaptive:
- return nn.AdaptiveMaxPool2d
- else:
- return nn.MaxPool2d
- elif dimension == 3:
- if pool_type == 'avg':
- if adaptive:
- return nn.AdaptiveAvgPool3d
- else:
- return nn.AvgPool3d
- elif pool_type == 'max':
- if adaptive:
- return nn.AdaptiveMaxPool3d
- else:
- return nn.MaxPool3d
-
-def drop_path(x, drop_prob: float = 0., training: bool = False, scale_by_keep: bool = True):
- """
- This function is taken from the timm package (https://github.com/rwightman/pytorch-image-models/blob/master/timm/models/layers/drop.py).
-
- Drop paths (Stochastic Depth) per sample (when applied in main path of residual blocks).
- This is the same as the DropConnect impl I created for EfficientNet, etc networks, however,
- the original name is misleading as 'Drop Connect' is a different form of dropout in a separate paper...
- See discussion: https://github.com/tensorflow/tpu/issues/494#issuecomment-532968956 ... I've opted for
- changing the layer and argument names to 'drop path' rather than mix DropConnect as a layer name and use
- 'survival rate' as the argument.
- """
- if drop_prob == 0. or not training:
- return x
- keep_prob = 1 - drop_prob
- shape = (x.shape[0],) + (1,) * (x.ndim - 1) # work with diff dim tensors, not just 2D ConvNets
- random_tensor = x.new_empty(shape).bernoulli_(keep_prob)
- if keep_prob > 0.0 and scale_by_keep:
- random_tensor.div_(keep_prob)
- return x * random_tensor
-
-class DropPath(nn.Module):
- """
- This class is taken from the timm package (https://github.com/rwightman/pytorch-image-models/blob/master/timm/models/layers/drop.py).
-
- Drop paths (Stochastic Depth) per sample (when applied in main path of residual blocks).
- """
- def __init__(self, drop_prob: float = 0., scale_by_keep: bool = True):
- super(DropPath, self).__init__()
- self.drop_prob = drop_prob
- self.scale_by_keep = scale_by_keep
-
- def forward(self, x):
- return drop_path(x, self.drop_prob, self.training, self.scale_by_keep)
-
-def make_divisible(v, divisor=8, min_value=None, round_limit=.9):
- """
- This function is taken from the timm package (https://github.com/rwightman/pytorch-image-models/blob/b7cb8d0337b3e7b50516849805ddb9be5fc11644/timm/models/layers/helpers.py#L25)
- """
- min_value = min_value or divisor
- new_v = max(min_value, int(v + divisor / 2) // divisor * divisor)
- # Make sure that round down does not go down by more than 10%.
- if new_v < round_limit * v:
- new_v += divisor
- return new_v
-
-class SqueezeExcite(nn.Module):
- """
- This class is taken from the timm package (https://github.com/rwightman/pytorch-image-models/blob/master/timm/models/layers/squeeze_excite.py)
- and slightly modified so that the convolution type can be adapted.
-
- SE Module as defined in original SE-Nets with a few additions
- Additions include:
- * divisor can be specified to keep channels % div == 0 (default: 8)
- * reduction channels can be specified directly by arg (if rd_channels is set)
- * reduction channels can be specified by float rd_ratio (default: 1/16)
- * global max pooling can be added to the squeeze aggregation
- * customizable activation, normalization, and gate layer
- """
- def __init__(
- self, channels, conv_op, rd_ratio=1. / 16, rd_channels=None, rd_divisor=8, add_maxpool=False,
- act_layer=nn.ReLU, norm_layer=None, gate_layer=nn.Sigmoid):
- super(SqueezeExcite, self).__init__()
- self.add_maxpool = add_maxpool
- if not rd_channels:
- rd_channels = make_divisible(channels * rd_ratio, rd_divisor, round_limit=0.)
- self.fc1 = conv_op(channels, rd_channels, kernel_size=1, bias=True)
- self.bn = norm_layer(rd_channels) if norm_layer else nn.Identity()
- self.act = act_layer(inplace=True)
- self.fc2 = conv_op(rd_channels, channels, kernel_size=1, bias=True)
- self.gate = gate_layer()
-
- def forward(self, x):
- x_se = x.mean((2, 3), keepdim=True)
- if self.add_maxpool:
- # experimental codepath, may remove or change
- x_se = 0.5 * x_se + 0.5 * x.amax((2, 3), keepdim=True)
- x_se = self.fc1(x_se)
- x_se = self.act(self.bn(x_se))
- x_se = self.fc2(x_se)
- return x * self.gate(x_se)
-
-
-class ConvDropoutNormReLU(nn.Module):
- def __init__(self,
- conv_op: Type[_ConvNd],
- input_channels: int,
- output_channels: int,
- kernel_size: Union[int, List[int], Tuple[int, ...]],
- stride: Union[int, List[int], Tuple[int, ...]],
- conv_bias: bool = False,
- norm_op: Union[None, Type[nn.Module]] = None,
- norm_op_kwargs: dict = None,
- dropout_op: Union[None, Type[_DropoutNd]] = None,
- dropout_op_kwargs: dict = None,
- nonlin: Union[None, Type[torch.nn.Module]] = None,
- nonlin_kwargs: dict = None,
- nonlin_first: bool = False
- ):
- super(ConvDropoutNormReLU, self).__init__()
- self.input_channels = input_channels
- self.output_channels = output_channels
- if not isinstance(stride, (tuple, list, np.ndarray)):
- stride = [stride] * dim_of_conv_op(conv_op)
- self.stride = stride
-
- if not isinstance(kernel_size, (tuple, list, np.ndarray)):
- kernel_size = [kernel_size] * dim_of_conv_op(conv_op)
- if norm_op_kwargs is None:
- norm_op_kwargs = {}
- if nonlin_kwargs is None:
- nonlin_kwargs = {}
-
- ops = []
-
- self.conv = conv_op(
- input_channels,
- output_channels,
- kernel_size,
- stride,
- padding=[(i - 1) // 2 for i in kernel_size],
- dilation=1,
- bias=conv_bias,
- )
- ops.append(self.conv)
-
- if dropout_op is not None:
- self.dropout = dropout_op(**dropout_op_kwargs)
- ops.append(self.dropout)
-
- if norm_op is not None:
- self.norm = norm_op(output_channels, **norm_op_kwargs)
- ops.append(self.norm)
-
- if nonlin is not None:
- self.nonlin = nonlin(**nonlin_kwargs)
- ops.append(self.nonlin)
-
- if nonlin_first and (norm_op is not None and nonlin is not None):
- ops[-1], ops[-2] = ops[-2], ops[-1]
-
- self.all_modules = nn.Sequential(*ops)
-
- def forward(self, x):
- return self.all_modules(x)
-
- def compute_conv_feature_map_size(self, input_size):
- assert len(input_size) == len(self.stride), "just give the image size without color/feature channels or " \
- "batch channel. Do not give input_size=(b, c, x, y(, z)). " \
- "Give input_size=(x, y(, z))!"
- output_size = [i // j for i, j in zip(input_size, self.stride)] # we always do same padding
- return np.prod([self.output_channels, *output_size], dtype=np.int64)
-
-# # from dynamic_network_architectures.building_blocks.residual import BasicBlockD
-class BasicBlockD(nn.Module):
- def __init__(self,
- conv_op: Type[_ConvNd],
- input_channels: int,
- output_channels: int,
- kernel_size: Union[int, List[int], Tuple[int, ...]],
- stride: Union[int, List[int], Tuple[int, ...]],
- conv_bias: bool = False,
- norm_op: Union[None, Type[nn.Module]] = None,
- norm_op_kwargs: dict = None,
- dropout_op: Union[None, Type[_DropoutNd]] = None,
- dropout_op_kwargs: dict = None,
- nonlin: Union[None, Type[torch.nn.Module]] = None,
- nonlin_kwargs: dict = None,
- stochastic_depth_p: float = 0.0,
- squeeze_excitation: bool = False,
- squeeze_excitation_reduction_ratio: float = 1. / 16,
- # todo wideresnet?
- ):
- """
- This implementation follows ResNet-D:
-
- He, Tong, et al. "Bag of tricks for image classification with convolutional neural networks."
- Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition. 2019.
-
- The skip has an avgpool (if needed) followed by 1x1 conv instead of just a strided 1x1 conv
-
- :param conv_op:
- :param input_channels:
- :param output_channels:
- :param kernel_size: refers only to convs in feature extraction path, not to 1x1x1 conv in skip
- :param stride: only applies to first conv (and skip). Second conv always has stride 1
- :param conv_bias:
- :param norm_op:
- :param norm_op_kwargs:
- :param dropout_op: only the first conv can have dropout. The second never has
- :param dropout_op_kwargs:
- :param nonlin:
- :param nonlin_kwargs:
- :param stochastic_depth_p:
- :param squeeze_excitation:
- :param squeeze_excitation_reduction_ratio:
- """
- super().__init__()
- self.input_channels = input_channels
- self.output_channels = output_channels
- if not isinstance(stride, (tuple, list, np.ndarray)):
- stride = [stride] * dim_of_conv_op(conv_op)
- self.stride = stride
-
- if not isinstance(kernel_size, (tuple, list, np.ndarray)):
- kernel_size = [kernel_size] * dim_of_conv_op(conv_op)
-
- if norm_op_kwargs is None:
- norm_op_kwargs = {}
- if nonlin_kwargs is None:
- nonlin_kwargs = {}
-
- self.conv1 = ConvDropoutNormReLU(conv_op, input_channels, output_channels, kernel_size, stride, conv_bias,
- norm_op, norm_op_kwargs, dropout_op, dropout_op_kwargs, nonlin, nonlin_kwargs)
- self.conv2 = ConvDropoutNormReLU(conv_op, output_channels, output_channels, kernel_size, 1, conv_bias, norm_op,
- norm_op_kwargs, None, None, None, None)
-
- self.nonlin2 = nonlin(**nonlin_kwargs) if nonlin is not None else lambda x: x
-
- # Stochastic Depth
- self.apply_stochastic_depth = False if stochastic_depth_p == 0.0 else True
- if self.apply_stochastic_depth:
- self.drop_path = DropPath(drop_prob=stochastic_depth_p)
-
- # Squeeze Excitation
- self.apply_se = squeeze_excitation
- if self.apply_se:
- self.squeeze_excitation = SqueezeExcite(self.output_channels, conv_op,
- rd_ratio=squeeze_excitation_reduction_ratio, rd_divisor=8)
-
- has_stride = (isinstance(stride, int) and stride != 1) or any([i != 1 for i in stride])
- requires_projection = (input_channels != output_channels)
-
- if has_stride or requires_projection:
- ops = []
- if has_stride:
- ops.append(get_matching_pool_op(conv_op=conv_op, adaptive=False, pool_type='avg')(stride, stride))
- if requires_projection:
- ops.append(
- ConvDropoutNormReLU(conv_op, input_channels, output_channels, 1, 1, False, norm_op,
- norm_op_kwargs, None, None, None, None
- )
- )
- self.skip = nn.Sequential(*ops)
- else:
- self.skip = lambda x: x
-
- def forward(self, x):
- residual = self.skip(x)
- out = self.conv2(self.conv1(x))
- if self.apply_stochastic_depth:
- out = self.drop_path(out)
- if self.apply_se:
- out = self.squeeze_excitation(out)
- out += residual
- return self.nonlin2(out)
-
- def compute_conv_feature_map_size(self, input_size):
- assert len(input_size) == len(self.stride), "just give the image size without color/feature channels or " \
- "batch channel. Do not give input_size=(b, c, x, y(, z)). " \
- "Give input_size=(x, y(, z))!"
- size_after_stride = [i // j for i, j in zip(input_size, self.stride)]
- # conv1
- output_size_conv1 = np.prod([self.output_channels, *size_after_stride], dtype=np.int64)
- # conv2
- output_size_conv2 = np.prod([self.output_channels, *size_after_stride], dtype=np.int64)
- # skip conv (if applicable)
- if (self.input_channels != self.output_channels) or any([i != j for i, j in zip(input_size, size_after_stride)]):
- assert isinstance(self.skip, nn.Sequential)
- output_size_skip = np.prod([self.output_channels, *size_after_stride], dtype=np.int64)
- else:
- assert not isinstance(self.skip, nn.Sequential)
- output_size_skip = 0
- return output_size_conv1 + output_size_conv2 + output_size_skip
-
-class UpsampleLayer(nn.Module):
- def __init__(
- self,
- conv_op,
- input_channels,
- output_channels,
- pool_op_kernel_size,
- mode='nearest'
- ):
- super().__init__()
- self.conv = conv_op(input_channels, output_channels, kernel_size=1)
- self.pool_op_kernel_size = pool_op_kernel_size
- self.mode = mode
-
- def forward(self, x):
- x = F.interpolate(x, scale_factor=self.pool_op_kernel_size, mode=self.mode)
- x = self.conv(x)
- return x
-
-# class MambaLayer(nn.Module):
-# def __init__(self, dim, d_state = 16, d_conv = 4, expand = 2):
-# super().__init__()
-# self.dim = dim
-# self.norm = nn.LayerNorm(dim)
-# self.mamba = Mamba(
-# d_model=dim, # Model dimension d_model
-# d_state=d_state, # SSM state expansion factor
-# d_conv=d_conv, # Local convolution width
-# expand=expand, # Block expansion factor
-# )
-
-# @autocast(enabled=False)
-# def forward(self, x):
-# if x.dtype == torch.float16:
-# x = x.type(torch.float32)
-# B, C = x.shape[:2]
-# assert C == self.dim
-# n_tokens = x.shape[2:].numel()
-# img_dims = x.shape[2:]
-# x_flat = x.reshape(B, C, n_tokens).transpose(-1, -2)
-# x_norm = self.norm(x_flat)
-# x_mamba = self.mamba(x_norm)
-# out = x_mamba.transpose(-1, -2).reshape(B, C, *img_dims)
-
-# return out
-
-class MambaLayer(nn.Module):
- def __init__(self, dim, d_state = 16, d_conv = 4, expand = 2, channel_token = False):
- super().__init__()
- self.dim = dim
- self.norm = nn.LayerNorm(dim)
- self.mamba = Mamba(
- d_model=dim, # Model dimension d_model
- d_state=d_state, # SSM state expansion factor
- d_conv=d_conv, # Local convolution width
- expand=expand, # Block expansion factor
- )
- self.channel_token = channel_token ## whether to use channel as tokens
-
- def forward_patch_token(self, x):
- B, d_model = x.shape[:2]
- assert d_model == self.dim
- n_tokens = x.shape[2:].numel()
- img_dims = x.shape[2:]
- x_flat = x.reshape(B, d_model, n_tokens).transpose(-1, -2)
- x_norm = self.norm(x_flat)
- x_mamba = self.mamba(x_norm)
- out = x_mamba.transpose(-1, -2).reshape(B, d_model, *img_dims)
-
- return out
-
- def forward_channel_token(self, x):
- B, n_tokens = x.shape[:2]
- d_model = x.shape[2:].numel()
- assert d_model == self.dim, f"d_model: {d_model}, self.dim: {self.dim}"
- img_dims = x.shape[2:]
- x_flat = x.flatten(2)
- assert x_flat.shape[2] == d_model, f"x_flat.shape[2]: {x_flat.shape[2]}, d_model: {d_model}"
- x_norm = self.norm(x_flat)
- x_mamba = self.mamba(x_norm)
- out = x_mamba.reshape(B, n_tokens, *img_dims)
-
- return out
-
- @autocast(enabled=False)
- def forward(self, x):
- if x.dtype == torch.float16:
- x = x.type(torch.float32)
-
- if self.channel_token:
- out = self.forward_channel_token(x)
- else:
- out = self.forward_patch_token(x)
-
- return out
-
-
-class BasicResBlock(nn.Module):
- def __init__(
- self,
- conv_op,
- input_channels,
- output_channels,
- norm_op,
- norm_op_kwargs,
- kernel_size=3,
- padding=1,
- stride=1,
- use_1x1conv=False,
- nonlin=nn.LeakyReLU,
- nonlin_kwargs={'inplace': True}
- ):
- super().__init__()
-
- self.conv1 = conv_op(input_channels, output_channels, kernel_size, stride=stride, padding=padding)
- self.norm1 = norm_op(output_channels, **norm_op_kwargs)
- self.act1 = nonlin(**nonlin_kwargs)
-
- self.conv2 = conv_op(output_channels, output_channels, kernel_size, padding=padding)
- self.norm2 = norm_op(output_channels, **norm_op_kwargs)
- self.act2 = nonlin(**nonlin_kwargs)
-
- if use_1x1conv:
- self.conv3 = conv_op(input_channels, output_channels, kernel_size=1, stride=stride)
- else:
- self.conv3 = None
-
- def forward(self, x):
- y = self.conv1(x)
- y = self.act1(self.norm1(y))
- y = self.norm2(self.conv2(y))
- if self.conv3:
- x = self.conv3(x)
- y += x
- return self.act2(y)
-
-class UNetResEncoder(nn.Module):
- def __init__(self,
- input_channels: int,
- n_stages: int,
- features_per_stage: Union[int, List[int], Tuple[int, ...]],
- conv_op: Type[_ConvNd],
- kernel_sizes: Union[int, List[int], Tuple[int, ...]],
- strides: Union[int, List[int], Tuple[int, ...], Tuple[Tuple[int, ...], ...]],
- n_blocks_per_stage: Union[int, List[int], Tuple[int, ...]],
- conv_bias: bool = False,
- norm_op: Union[None, Type[nn.Module]] = None,
- norm_op_kwargs: dict = None,
- nonlin: Union[None, Type[torch.nn.Module]] = None,
- nonlin_kwargs: dict = None,
- return_skips: bool = False,
- stem_channels: int = None,
- pool_type: str = 'conv',
- ):
- super().__init__()
- if isinstance(kernel_sizes, int):
- kernel_sizes = [kernel_sizes] * n_stages
- if isinstance(features_per_stage, int):
- features_per_stage = [features_per_stage] * n_stages
- if isinstance(n_blocks_per_stage, int):
- n_blocks_per_stage = [n_blocks_per_stage] * n_stages
- if isinstance(strides, int):
- strides = [strides] * n_stages
-
- assert len(
- kernel_sizes) == n_stages, "kernel_sizes must have as many entries as we have resolution stages (n_stages)"
- assert len(
- n_blocks_per_stage) == n_stages, "n_conv_per_stage must have as many entries as we have resolution stages (n_stages)"
- assert len(
- features_per_stage) == n_stages, "features_per_stage must have as many entries as we have resolution stages (n_stages)"
- assert len(strides) == n_stages, "strides must have as many entries as we have resolution stages (n_stages). " \
- "Important: first entry is recommended to be 1, else we run strided conv drectly on the input"
-
- pool_op = get_matching_pool_op(conv_op, pool_type=pool_type) if pool_type != 'conv' else None
-
- self.conv_pad_sizes = []
- for krnl in kernel_sizes:
- self.conv_pad_sizes.append([i // 2 for i in krnl])
-
- stem_channels = features_per_stage[0]
-
- self.stem = nn.Sequential(
- BasicResBlock(
- conv_op = conv_op,
- input_channels = input_channels,
- output_channels = stem_channels,
- norm_op=norm_op,
- norm_op_kwargs=norm_op_kwargs,
- kernel_size=kernel_sizes[0],
- padding=self.conv_pad_sizes[0],
- stride=1,
- nonlin=nonlin,
- nonlin_kwargs=nonlin_kwargs,
- use_1x1conv=True
- ),
- *[
- BasicBlockD(
- conv_op = conv_op,
- input_channels = stem_channels,
- output_channels = stem_channels,
- kernel_size = kernel_sizes[0],
- stride = 1,
- conv_bias = conv_bias,
- norm_op = norm_op,
- norm_op_kwargs = norm_op_kwargs,
- nonlin = nonlin,
- nonlin_kwargs = nonlin_kwargs,
- ) for _ in range(n_blocks_per_stage[0] - 1)
- ]
- )
-
-
- input_channels = stem_channels
-
- # now build the network
- stages = []
- for s in range(n_stages):
- stage = nn.Sequential(
- BasicResBlock(
- conv_op = conv_op,
- norm_op = norm_op,
- norm_op_kwargs = norm_op_kwargs,
- input_channels = input_channels,
- output_channels = features_per_stage[s],
- kernel_size = kernel_sizes[s],
- padding=self.conv_pad_sizes[s],
- stride=strides[s],
- use_1x1conv=True,
- nonlin = nonlin,
- nonlin_kwargs = nonlin_kwargs
- ),
- *[
- BasicBlockD(
- conv_op = conv_op,
- input_channels = features_per_stage[s],
- output_channels = features_per_stage[s],
- kernel_size = kernel_sizes[s],
- stride = 1,
- conv_bias = conv_bias,
- norm_op = norm_op,
- norm_op_kwargs = norm_op_kwargs,
- nonlin = nonlin,
- nonlin_kwargs = nonlin_kwargs,
- ) for _ in range(n_blocks_per_stage[s] - 1)
- ]
- )
-
- stages.append(stage)
- input_channels = features_per_stage[s]
-
- self.stages = nn.Sequential(*stages)
- self.output_channels = features_per_stage
- self.strides = [[item] * dim_of_conv_op(conv_op) if not isinstance(item, (tuple, list, np.ndarray)) \
- else item for item in strides]
- # self.strides = [maybe_convert_scalar_to_list(conv_op, i) for i in strides]
-
- self.return_skips = return_skips
-
- self.conv_op = conv_op
- self.norm_op = norm_op
- self.norm_op_kwargs = norm_op_kwargs
- self.nonlin = nonlin
- self.nonlin_kwargs = nonlin_kwargs
- #self.dropout_op = dropout_op
- #self.dropout_op_kwargs = dropout_op_kwargs
- self.conv_bias = conv_bias
- self.kernel_sizes = kernel_sizes
-
- def forward(self, x):
- if self.stem is not None:
- x = self.stem(x)
- ret = []
- for s in self.stages:
- x = s(x)
- ret.append(x)
- if self.return_skips:
- return ret
- else:
- return ret[-1]
-
- def compute_conv_feature_map_size(self, input_size):
- if self.stem is not None:
- output = self.stem.compute_conv_feature_map_size(input_size)
- else:
- output = np.int64(0)
-
- for s in range(len(self.stages)):
- output += self.stages[s].compute_conv_feature_map_size(input_size)
- input_size = [i // j for i, j in zip(input_size, self.strides[s])]
-
- return output
-
-
-class UNetResDecoder(nn.Module):
- def __init__(self,
- encoder,
- num_classes,
- n_conv_per_stage: Union[int, Tuple[int, ...], List[int]],
- deep_supervision, nonlin_first: bool = False):
-
- super().__init__()
- self.deep_supervision = deep_supervision
- self.encoder = encoder
- self.num_classes = num_classes
- n_stages_encoder = len(encoder.output_channels)
- if isinstance(n_conv_per_stage, int):
- n_conv_per_stage = [n_conv_per_stage] * (n_stages_encoder - 1)
- assert len(n_conv_per_stage) == n_stages_encoder - 1, "n_conv_per_stage must have as many entries as we have " \
- "resolution stages - 1 (n_stages in encoder - 1), " \
- "here: %d" % n_stages_encoder
-
- stages = []
- upsample_layers = []
-
- seg_layers = []
- for s in range(1, n_stages_encoder):
- input_features_below = encoder.output_channels[-s]
- input_features_skip = encoder.output_channels[-(s + 1)]
- stride_for_upsampling = encoder.strides[-s]
- upsample_layers.append(UpsampleLayer(
- conv_op = encoder.conv_op,
- input_channels = input_features_below,
- output_channels = input_features_skip,
- pool_op_kernel_size = stride_for_upsampling,
- mode='nearest'
- ))
-
- stages.append(nn.Sequential(
- BasicResBlock(
- conv_op = encoder.conv_op,
- norm_op = encoder.norm_op,
- norm_op_kwargs = encoder.norm_op_kwargs,
- nonlin = encoder.nonlin,
- nonlin_kwargs = encoder.nonlin_kwargs,
- input_channels = 2 * input_features_skip if s < n_stages_encoder - 1 else input_features_skip,
- output_channels = input_features_skip,
- kernel_size = encoder.kernel_sizes[-(s + 1)],
- padding=encoder.conv_pad_sizes[-(s + 1)],
- stride=1,
- use_1x1conv=True
- ),
- *[
- BasicBlockD(
- conv_op = encoder.conv_op,
- input_channels = input_features_skip,
- output_channels = input_features_skip,
- kernel_size = encoder.kernel_sizes[-(s + 1)],
- stride = 1,
- conv_bias = encoder.conv_bias,
- norm_op = encoder.norm_op,
- norm_op_kwargs = encoder.norm_op_kwargs,
- nonlin = encoder.nonlin,
- nonlin_kwargs = encoder.nonlin_kwargs,
- ) for _ in range(n_conv_per_stage[s-1] - 1)
- ]
- ))
- seg_layers.append(encoder.conv_op(input_features_skip, num_classes, 1, 1, 0, bias=True))
-
- self.stages = nn.ModuleList(stages)
- self.upsample_layers = nn.ModuleList(upsample_layers)
- self.seg_layers = nn.ModuleList(seg_layers)
-
- def forward(self, skips):
- lres_input = skips[-1]
- seg_outputs = []
- for s in range(len(self.stages)):
- x = self.upsample_layers[s](lres_input)
- if s < (len(self.stages) - 1):
- x = torch.cat((x, skips[-(s+2)]), 1)
- x = self.stages[s](x)
- if self.deep_supervision:
- seg_outputs.append(self.seg_layers[s](x))
- elif s == (len(self.stages) - 1):
- seg_outputs.append(self.seg_layers[-1](x))
- lres_input = x
- seg_outputs = seg_outputs[::-1]
-
- if not self.deep_supervision:
- r = seg_outputs[0]
- else:
- r = seg_outputs
- return r
-
- def compute_conv_feature_map_size(self, input_size):
- skip_sizes = []
- for s in range(len(self.encoder.strides) - 1):
- skip_sizes.append([i // j for i, j in zip(input_size, self.encoder.strides[s])])
- input_size = skip_sizes[-1]
-
- assert len(skip_sizes) == len(self.stages)
-
- output = np.int64(0)
- for s in range(len(self.stages)):
- output += self.stages[s].compute_conv_feature_map_size(skip_sizes[-(s+1)])
- output += np.prod([self.encoder.output_channels[-(s+2)], *skip_sizes[-(s+1)]], dtype=np.int64)
- if self.deep_supervision or (s == (len(self.stages) - 1)):
- output += np.prod([self.num_classes, *skip_sizes[-(s+1)]], dtype=np.int64)
- return output
-
-
-class UMambaBot(nn.Module):
- """
- UMambaBot that uses Mamba block at the bottleneck of UNet.
-
- * Reference: Jun Ma, Feifei Li, Bo Wang.
- U-Mamba: Enhancing long-range dependency for biomedical image segmentation.
- arxiv 2403.20035, 2024.
-
- The implementation is based on the code at:
- https://github.com/bowang-lab/U-Mamba.
-
- The parameters for the backbone should be given in the `params` dictionary.
-
- :param in_chns: (int) Input channel number.
- :param feature_chns: (list) Feature channel for each resolution level.
- The length should be 4 or 5, such as [16, 32, 64, 128, 256].
- :param class_num: (int) The class number for segmentation task.
- :param n_blocks_per_stage: (int) the number of con blocks at each stage.
- """
- def __init__(self, params):
- super(UMambaBot, self).__init__()
- params = self.get_default_parameters(params)
- for p in params:
- print(p, params[p])
-
- # def __init__(self,
- # input_channels: int,
- # n_stages: int,
- # features_per_stage: Union[int, List[int], Tuple[int, ...]],
- # conv_op: Type[_ConvNd],
- # kernel_sizes: Union[int, List[int], Tuple[int, ...]],
- # strides: Union[int, List[int], Tuple[int, ...]],
- # n_conv_per_stage: Union[int, List[int], Tuple[int, ...]],
- # num_classes: int,
- # n_conv_per_stage_decoder: Union[int, Tuple[int, ...], List[int]],
- # conv_bias: bool = False,
- # norm_op: Union[None, Type[nn.Module]] = None,
- # norm_op_kwargs: dict = None,
- # dropout_op: Union[None, Type[_DropoutNd]] = None,
- # dropout_op_kwargs: dict = None,
- # nonlin: Union[None, Type[torch.nn.Module]] = None,
- # nonlin_kwargs: dict = None,
- # deep_supervision: bool = False,
- # stem_channels: int = None
- # ):
- # super().__init__()
-
- input_channels = params['in_chns']
- features_per_stage = params['feature_chns']
- num_classes = params['class_num']
- n_blocks_per_stage = params['n_blocks_per_stage']
- n_conv_per_stage_decoder = n_blocks_per_stage
- n_stages = len(features_per_stage)
- conv_op = nn.Conv2d
- kernel_sizes = [(3,3)] * len(features_per_stage)
- strides = [(1, 1)] + [(2,2)] * (len(features_per_stage) - 1)
- # strides = [(1,1)] * len(features_per_stage)
-
- conv_bias = True
- norm_op = nn.InstanceNorm2d
- norm_op_kwargs = {"affine":True}
- nonlin=nn.LeakyReLU
- nonlin_kwargs={'inplace': True}
- deep_supervision = False
- stem_channels = None
-
- if isinstance(n_blocks_per_stage, int):
- n_blocks_per_stage = [n_blocks_per_stage] * n_stages
- if isinstance(n_conv_per_stage_decoder, int):
- n_conv_per_stage_decoder = [n_conv_per_stage_decoder] * (n_stages - 1)
-
- for s in range(math.ceil(n_stages / 2), n_stages):
- n_blocks_per_stage[s] = 1
-
- for s in range(math.ceil((n_stages - 1) / 2 + 0.5), n_stages - 1):
- n_conv_per_stage_decoder[s] = 1
-
-
- assert len(n_blocks_per_stage) == n_stages, "n_blocks_per_stage must have as many entries as we have " \
- f"resolution stages. here: {n_stages}. " \
- f"n_blocks_per_stage: {n_blocks_per_stage}"
- assert len(n_conv_per_stage_decoder) == (n_stages - 1), "n_conv_per_stage_decoder must have one less entries " \
- f"as we have resolution stages. here: {n_stages} " \
- f"stages, so it should have {n_stages - 1} entries. " \
- f"n_conv_per_stage_decoder: {n_conv_per_stage_decoder}"
-
-
- self.encoder = UNetResEncoder(
- input_channels,
- n_stages,
- features_per_stage,
- conv_op,
- kernel_sizes,
- strides,
- n_blocks_per_stage,
- conv_bias,
- norm_op,
- norm_op_kwargs,
- nonlin,
- nonlin_kwargs,
- return_skips=True,
- stem_channels=stem_channels
- )
-
- self.mamba_layer = MambaLayer(dim = features_per_stage[-1])
-
- self.decoder = UNetResDecoder(self.encoder, num_classes, n_conv_per_stage_decoder, deep_supervision)
-
- def get_default_parameters(self, params):
- default_param = {
- 'feature_chns': [32, 64, 128, 256, 512],
- 'n_blocks_per_stage': 2
- }
- for key in default_param:
- params[key] = params.get(key, default_param[key])
- for key in params:
- logging.info("{0:} = {1:}".format(key, params[key]))
- return params
-
- def forward(self, x):
- x_shape = list(x.shape)
- if(len(x_shape) == 5):
- [N, C, D, H, W] = x_shape
- new_shape = [N*D, C, H, W]
- x = torch.transpose(x, 1, 2)
- x = torch.reshape(x, new_shape)
- skips = self.encoder(x)
- # for skip in skips:
- # print(skip.shape)
- skips[-1] = self.mamba_layer(skips[-1])
- output = self.decoder(skips)
- if(len(x_shape) == 5):
- if(isinstance(output, (list,tuple))):
- for i in range(len(output)):
- new_shape = [N, D] + list(output[i].shape)[1:]
- output[i] = torch.transpose(torch.reshape(output[i], new_shape), 1, 2)
- else:
- new_shape = [N, D] + list(output.shape)[1:]
- output = torch.transpose(torch.reshape(output, new_shape), 1, 2)
- return output
-
- def compute_conv_feature_map_size(self, input_size):
- assert len(input_size) == dim_of_conv_op(self.encoder.conv_op), "just give the image size without color/feature channels or " \
- "batch channel. Do not give input_size=(b, c, x, y(, z)). " \
- "Give input_size=(x, y(, z))!"
- return self.encoder.compute_conv_feature_map_size(input_size) + self.decoder.compute_conv_feature_map_size(input_size)
-
-class ResidualMambaEncoder(nn.Module):
- def __init__(self,
- input_size: Tuple[int, ...],
- input_channels: int,
- n_stages: int,
- features_per_stage: Union[int, List[int], Tuple[int, ...]],
- conv_op: Type[_ConvNd],
- kernel_sizes: Union[int, List[int], Tuple[int, ...]],
- strides: Union[int, List[int], Tuple[int, ...], Tuple[Tuple[int, ...], ...]],
- n_blocks_per_stage: Union[int, List[int], Tuple[int, ...]],
- conv_bias: bool = False,
- norm_op: Union[None, Type[nn.Module]] = None,
- norm_op_kwargs: dict = None,
- nonlin: Union[None, Type[torch.nn.Module]] = None,
- nonlin_kwargs: dict = None,
- return_skips: bool = False,
- stem_channels: int = None,
- pool_type: str = 'conv',
- ):
- super().__init__()
- if isinstance(kernel_sizes, int):
- kernel_sizes = [kernel_sizes] * n_stages
- if isinstance(features_per_stage, int):
- features_per_stage = [features_per_stage] * n_stages
- if isinstance(n_blocks_per_stage, int):
- n_blocks_per_stage = [n_blocks_per_stage] * n_stages
- if isinstance(strides, int):
- strides = [strides] * n_stages
- assert len(
- kernel_sizes) == n_stages, "kernel_sizes must have as many entries as we have resolution stages (n_stages)"
- assert len(
- n_blocks_per_stage) == n_stages, "n_conv_per_stage must have as many entries as we have resolution stages (n_stages)"
- assert len(
- features_per_stage) == n_stages, "features_per_stage must have as many entries as we have resolution stages (n_stages)"
- assert len(strides) == n_stages, "strides must have as many entries as we have resolution stages (n_stages). " \
- "Important: first entry is recommended to be 1, else we run strided conv drectly on the input"
-
- pool_op = get_matching_pool_op(conv_op, pool_type=pool_type) if pool_type != 'conv' else None
-
- do_channel_token = [False] * n_stages
- feature_map_sizes = []
- feature_map_size = input_size
- for s in range(n_stages):
- feature_map_sizes.append([i // j for i, j in zip(feature_map_size, strides[s])])
- feature_map_size = feature_map_sizes[-1]
- if np.prod(feature_map_size) <= features_per_stage[s]:
- do_channel_token[s] = True
-
-
- print(f"feature_map_sizes: {feature_map_sizes}")
- print(f"do_channel_token: {do_channel_token}")
-
- self.conv_pad_sizes = []
- for krnl in kernel_sizes:
- self.conv_pad_sizes.append([i // 2 for i in krnl])
-
- stem_channels = features_per_stage[0]
- self.stem = nn.Sequential(
- BasicResBlock(
- conv_op = conv_op,
- input_channels = input_channels,
- output_channels = stem_channels,
- norm_op=norm_op,
- norm_op_kwargs=norm_op_kwargs,
- kernel_size=kernel_sizes[0],
- padding=self.conv_pad_sizes[0],
- stride=1,
- nonlin=nonlin,
- nonlin_kwargs=nonlin_kwargs,
- use_1x1conv=True
- ),
- *[
- BasicBlockD(
- conv_op = conv_op,
- input_channels = stem_channels,
- output_channels = stem_channels,
- kernel_size = kernel_sizes[0],
- stride = 1,
- conv_bias = conv_bias,
- norm_op = norm_op,
- norm_op_kwargs = norm_op_kwargs,
- nonlin = nonlin,
- nonlin_kwargs = nonlin_kwargs,
- ) for _ in range(n_blocks_per_stage[0] - 1)
- ]
- )
-
- input_channels = stem_channels
-
- stages = []
- mamba_layers = []
- for s in range(n_stages):
- stage = nn.Sequential(
- BasicResBlock(
- conv_op = conv_op,
- norm_op = norm_op,
- norm_op_kwargs = norm_op_kwargs,
- input_channels = input_channels,
- output_channels = features_per_stage[s],
- kernel_size = kernel_sizes[s],
- padding=self.conv_pad_sizes[s],
- stride=strides[s],
- use_1x1conv=True,
- nonlin = nonlin,
- nonlin_kwargs = nonlin_kwargs
- ),
- *[
- BasicBlockD(
- conv_op = conv_op,
- input_channels = features_per_stage[s],
- output_channels = features_per_stage[s],
- kernel_size = kernel_sizes[s],
- stride = 1,
- conv_bias = conv_bias,
- norm_op = norm_op,
- norm_op_kwargs = norm_op_kwargs,
- nonlin = nonlin,
- nonlin_kwargs = nonlin_kwargs,
- ) for _ in range(n_blocks_per_stage[s] - 1)
- ]
- )
-
- if bool(s % 2) ^ bool(n_stages % 2): ## gurantee the last stage has mamaba layer
- mamba_layers.append(
- MambaLayer(
- dim = np.prod(feature_map_sizes[s]) if do_channel_token[s] else features_per_stage[s],
- channel_token = do_channel_token[s]
- )
- )
- else:
- mamba_layers.append(nn.Identity())
-
- stages.append(stage)
- input_channels = features_per_stage[s]
-
- self.mamba_layers = nn.ModuleList(mamba_layers)
- self.stages = nn.ModuleList(stages)
- self.output_channels = features_per_stage
- self.strides = [[item] * dim_of_conv_op(conv_op) if not isinstance(item, (tuple, list, np.ndarray)) \
- else item for item in strides]
- # self.strides = [maybe_convert_scalar_to_list(conv_op, i) for i in strides]
- self.return_skips = return_skips
-
- self.conv_op = conv_op
- self.norm_op = norm_op
- self.norm_op_kwargs = norm_op_kwargs
- self.nonlin = nonlin
- self.nonlin_kwargs = nonlin_kwargs
- #self.dropout_op = dropout_op
- #self.dropout_op_kwargs = dropout_op_kwargs
- self.conv_bias = conv_bias
- self.kernel_sizes = kernel_sizes
-
- def forward(self, x):
- if self.stem is not None:
- x = self.stem(x)
- ret = []
- for s in range(len(self.stages)):
- x = self.stages[s](x)
- x = self.mamba_layers[s](x)
- ret.append(x)
- if self.return_skips:
- return ret
- else:
- return ret[-1]
-
- def compute_conv_feature_map_size(self, input_size):
- if self.stem is not None:
- output = self.stem.compute_conv_feature_map_size(input_size)
- else:
- output = np.int64(0)
-
- for s in range(len(self.stages)):
- output += self.stages[s].compute_conv_feature_map_size(input_size)
- input_size = [i // j for i, j in zip(input_size, self.strides[s])]
-
- return output
-
-
-class UMambaEnc(nn.Module):
- """
- UMambaEnc that uses Mamba block at the encoder and bottleneck of UNet.
-
- * Reference: Jun Ma, Feifei Li, Bo Wang.
- U-Mamba: Enhancing long-range dependency for biomedical image segmentation.
- arxiv 2403.20035, 2024.
-
- The implementation is based on the code at:
- https://github.com/bowang-lab/U-Mamba.
-
- The parameters for the backbone should be given in the `params` dictionary.
-
- :param input_size: (list) the size of input image, such as [256, 256]
- :param in_chns: (int) Input channel number.
- :param feature_chns: (list) Feature channel for each resolution level.
- The length should be 4 or 5, such as [16, 32, 64, 128, 256].
- :param class_num: (int) The class number for segmentation task.
- :param n_blocks_per_stage: (int) the number of con blocks at each stage.
- """
- def __init__(self, params):
- super(UMambaEnc, self).__init__()
- params = self.get_default_parameters(params)
- for p in params:
- print(p, params[p])
- # def __init__(self,
- # input_size: Tuple[int, ...],
- # input_channels: int,
- # n_stages: int,
- # features_per_stage: Union[int, List[int], Tuple[int, ...]],
- # conv_op: Type[_ConvNd],
- # kernel_sizes: Union[int, List[int], Tuple[int, ...]],
- # strides: Union[int, List[int], Tuple[int, ...]],
- # n_conv_per_stage: Union[int, List[int], Tuple[int, ...]],
- # num_classes: int,
- # n_conv_per_stage_decoder: Union[int, Tuple[int, ...], List[int]],
- # conv_bias: bool = False,
- # norm_op: Union[None, Type[nn.Module]] = None,
- # norm_op_kwargs: dict = None,
- # dropout_op: Union[None, Type[_DropoutNd]] = None,
- # dropout_op_kwargs: dict = None,
- # nonlin: Union[None, Type[torch.nn.Module]] = None,
- # nonlin_kwargs: dict = None,
- # deep_supervision: bool = False,
- # stem_channels: int = None
- # ):
- # super().__init__()
-
- input_size = params['input_size']
- input_channels = params['in_chns']
- features_per_stage = params['feature_chns']
- num_classes = params['class_num']
- n_blocks_per_stage = params['n_blocks_per_stage']
- n_conv_per_stage_decoder = n_blocks_per_stage
- n_stages = len(features_per_stage)
- conv_op = nn.Conv2d
- kernel_sizes = [(3,3)] * len(features_per_stage)
- strides = [(1, 1)] + [(2,2)] * (len(features_per_stage) - 1)
-
- conv_bias = True
- norm_op = nn.InstanceNorm2d
- norm_op_kwargs = {"affine":True}
- nonlin=nn.LeakyReLU
- nonlin_kwargs={'inplace': True}
- deep_supervision = False
- stem_channels = None
-
- if isinstance(n_blocks_per_stage, int):
- n_blocks_per_stage = [n_blocks_per_stage] * n_stages
- if isinstance(n_conv_per_stage_decoder, int):
- n_conv_per_stage_decoder = [n_conv_per_stage_decoder] * (n_stages - 1)
-
- for s in range(math.ceil(n_stages / 2), n_stages):
- n_blocks_per_stage[s] = 1
-
- for s in range(math.ceil((n_stages - 1) / 2 + 0.5), n_stages - 1):
- n_conv_per_stage_decoder[s] = 1
-
-
- assert len(n_blocks_per_stage) == n_stages, "n_blocks_per_stage must have as many entries as we have " \
- f"resolution stages. here: {n_stages}. " \
- f"n_blocks_per_stage: {n_blocks_per_stage}"
- assert len(n_conv_per_stage_decoder) == (n_stages - 1), "n_conv_per_stage_decoder must have one less entries " \
- f"as we have resolution stages. here: {n_stages} " \
- f"stages, so it should have {n_stages - 1} entries. " \
- f"n_conv_per_stage_decoder: {n_conv_per_stage_decoder}"
- self.encoder = ResidualMambaEncoder(
- input_size,
- input_channels,
- n_stages,
- features_per_stage,
- conv_op,
- kernel_sizes,
- strides,
- n_blocks_per_stage,
- conv_bias,
- norm_op,
- norm_op_kwargs,
- nonlin,
- nonlin_kwargs,
- return_skips=True,
- stem_channels=stem_channels
- )
-
- self.decoder = UNetResDecoder(self.encoder, num_classes, n_conv_per_stage_decoder, deep_supervision)
-
- def get_default_parameters(self, params):
- default_param = {
- 'feature_chns': [32, 64, 128, 256, 512],
- 'n_blocks_per_stage': 2
- }
- for key in default_param:
- params[key] = params.get(key, default_param[key])
- for key in params:
- logging.info("{0:} = {1:}".format(key, params[key]))
- return params
-
- def forward(self, x):
- x_shape = list(x.shape)
- if(len(x_shape) == 5):
- [N, C, D, H, W] = x_shape
- new_shape = [N*D, C, H, W]
- x = torch.transpose(x, 1, 2)
- x = torch.reshape(x, new_shape)
- skips = self.encoder(x)
- output = self.decoder(skips)
- if(len(x_shape) == 5):
- if(isinstance(output, (list,tuple))):
- for i in range(len(output)):
- new_shape = [N, D] + list(output[i].shape)[1:]
- output[i] = torch.transpose(torch.reshape(output[i], new_shape), 1, 2)
- else:
- new_shape = [N, D] + list(output.shape)[1:]
- output = torch.transpose(torch.reshape(output, new_shape), 1, 2)
- return output
-
- def compute_conv_feature_map_size(self, input_size):
- assert len(input_size) == dim_of_conv_op(self.encoder.conv_op), "just give the image size without color/feature channels or " \
- "batch channel. Do not give input_size=(b, c, x, y(, z)). " \
- "Give input_size=(x, y(, z))!"
- return self.encoder.compute_conv_feature_map_size(input_size) + self.decoder.compute_conv_feature_map_size(input_size)
-
diff --git a/pymic/net/net2d/unet2d.py b/pymic/net/net2d/unet2d.py
deleted file mode 100644
index be69f0d..0000000
--- a/pymic/net/net2d/unet2d.py
+++ /dev/null
@@ -1,267 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-
-import logging
-import torch
-import torch.nn as nn
-import numpy as np
-
-class ConvBlock(nn.Module):
- """
- Two convolution layers with batch norm and leaky relu.
- Droput is used between the two convolution layers.
-
- :param in_channels: (int) Input channel number.
- :param out_channels: (int) Output channel number.
- :param dropout_p: (int) Dropout probability.
- """
- def __init__(self,in_channels, out_channels, dropout_p):
- super(ConvBlock, self).__init__()
- self.conv_conv = nn.Sequential(
- nn.Conv2d(in_channels, out_channels, kernel_size=3, padding=1),
- nn.BatchNorm2d(out_channels),
- nn.LeakyReLU(),
- nn.Dropout(dropout_p),
- nn.Conv2d(out_channels, out_channels, kernel_size=3, padding=1),
- nn.BatchNorm2d(out_channels),
- nn.LeakyReLU()
- )
-
- def forward(self, x):
- return self.conv_conv(x)
-
-class DownBlock(nn.Module):
- """
- Downsampling followed by ConvBlock
-
- :param in_channels: (int) Input channel number.
- :param out_channels: (int) Output channel number.
- :param dropout_p: (int) Dropout probability.
- """
- def __init__(self, in_channels, out_channels, dropout_p):
- super(DownBlock, self).__init__()
- self.maxpool_conv = nn.Sequential(
- nn.MaxPool2d(2),
- ConvBlock(in_channels, out_channels, dropout_p)
- )
-
- def forward(self, x):
- return self.maxpool_conv(x)
-
-class UpBlock(nn.Module):
- """
- Upsampling followed by ConvBlock
-
- :param in_channels1: (int) Channel number of high-level features.
- :param in_channels2: (int) Channel number of low-level features.
- :param out_channels: (int) Output channel number.
- :param dropout_p: (int) Dropout probability.
- :param up_mode: (string or int) The mode for upsampling. The allowed values are:
- 0 (or `TransConv`), 1 (`Nearest`), 2 (`Bilinear`), 3 (`Bicubic`). The default value
- is 2 (`Bilinear`).
- """
- def __init__(self, in_channels1, in_channels2, out_channels, dropout_p, up_mode = 2):
- super(UpBlock, self).__init__()
- if(isinstance(up_mode, int)):
- up_mode_values = ["transconv", "nearest", "bilinear", "bicubic"]
- if(up_mode > 3):
- raise ValueError("The upsample mode should be 0-3, but {0:} is given.".format(up_mode))
- self.up_mode = up_mode_values[up_mode]
- else:
- self.up_mode = up_mode.lower()
-
- if (self.up_mode == "transconv"):
- self.up = nn.ConvTranspose2d(in_channels1, in_channels2, kernel_size=2, stride=2)
- else:
- self.conv1x1 = nn.Conv2d(in_channels1, in_channels2, kernel_size = 1)
- if(self.up_mode == "nearest"):
- self.up = nn.Upsample(scale_factor=2, mode=self.up_mode)
- else:
- self.up = nn.Upsample(scale_factor=2, mode=self.up_mode, align_corners=True)
- self.conv = ConvBlock(in_channels2 * 2, out_channels, dropout_p)
-
- def forward(self, x1, x2):
- if self.up_mode != "transconv":
- x1 = self.conv1x1(x1)
- x1 = self.up(x1)
- x = torch.cat([x2, x1], dim=1)
- return self.conv(x)
-
-class Encoder(nn.Module):
- """
- Encoder of 2D UNet.
-
- Parameters are given in the `params` dictionary, and should include the
- following fields:
-
- :param in_chns: (int) Input channel number.
- :param feature_chns: (list) Feature channel for each resolution level.
- The length should be 4 or 5, such as [16, 32, 64, 128, 256].
- :param dropout: (list) The dropout ratio for each resolution level.
- The length should be the same as that of `feature_chns`.
- """
- def __init__(self, params):
- super(Encoder, self).__init__()
- self.params = params
- self.in_chns = self.params['in_chns']
- self.ft_chns = self.params['feature_chns']
- self.dropout = self.params['dropout']
- assert(len(self.ft_chns) == 5 or len(self.ft_chns) == 4)
-
- self.in_conv= ConvBlock(self.in_chns, self.ft_chns[0], self.dropout[0])
- self.down1 = DownBlock(self.ft_chns[0], self.ft_chns[1], self.dropout[1])
- self.down2 = DownBlock(self.ft_chns[1], self.ft_chns[2], self.dropout[2])
- self.down3 = DownBlock(self.ft_chns[2], self.ft_chns[3], self.dropout[3])
- if(len(self.ft_chns) == 5):
- self.down4 = DownBlock(self.ft_chns[3], self.ft_chns[4], self.dropout[4])
-
- def forward(self, x):
- x0 = self.in_conv(x)
- x1 = self.down1(x0)
- x2 = self.down2(x1)
- x3 = self.down3(x2)
- output = [x0, x1, x2, x3]
- if(len(self.ft_chns) == 5):
- x4 = self.down4(x3)
- output.append(x4)
- return output
-
-class Decoder(nn.Module):
- """
- Decoder of 2D UNet.
-
- Parameters are given in the `params` dictionary, and should include the
- following fields:
-
- :param in_chns: (int) Input channel number.
- :param feature_chns: (list) Feature channel for each resolution level.
- The length should be 4 or 5, such as [16, 32, 64, 128, 256].
- :param dropout: (list) The dropout ratio for each resolution level.
- The length should be the same as that of `feature_chns`.
- :param class_num: (int) The class number for segmentation task.
- :param up_mode: (string or int) The mode for upsampling. The allowed values are:
- 0 (or `TransConv`), 1 (or `Nearest`), 2 (or `Bilinear`), 3 (or `Bicubic`).
- The default value is 2 (or `Bilinear`).
- :param multiscale_pred: (bool) Get multi-scale prediction.
- """
- def __init__(self, params):
- super(Decoder, self).__init__()
- self.params = params
- self.in_chns = self.params['in_chns']
- self.ft_chns = self.params['feature_chns']
- self.dropout = self.params['dropout']
- self.n_class = self.params['class_num']
- self.up_mode = self.params.get('up_mode', 2)
- self.mul_pred = self.params.get('multiscale_pred', False)
-
- assert(len(self.ft_chns) == 5 or len(self.ft_chns) == 4)
-
- if(len(self.ft_chns) == 5):
- self.up1 = UpBlock(self.ft_chns[4], self.ft_chns[3], self.ft_chns[3], self.dropout[3], self.up_mode)
- self.up2 = UpBlock(self.ft_chns[3], self.ft_chns[2], self.ft_chns[2], self.dropout[2], self.up_mode)
- self.up3 = UpBlock(self.ft_chns[2], self.ft_chns[1], self.ft_chns[1], self.dropout[1], self.up_mode)
- self.up4 = UpBlock(self.ft_chns[1], self.ft_chns[0], self.ft_chns[0], self.dropout[0], self.up_mode)
- self.out_conv = nn.Conv2d(self.ft_chns[0], self.n_class, kernel_size = 1)
-
- if(self.mul_pred and (self.training or self.mul_infer)):
- self.out_conv1 = nn.Conv2d(self.ft_chns[1], self.n_class, kernel_size = 1)
- self.out_conv2 = nn.Conv2d(self.ft_chns[2], self.n_class, kernel_size = 1)
- self.out_conv3 = nn.Conv2d(self.ft_chns[3], self.n_class, kernel_size = 1)
- self.stage = 'train'
-
- def set_stage(self, stage):
- self.stage = stage
-
- def forward(self, x):
- if(len(self.ft_chns) == 5):
- assert(len(x) == 5)
- x0, x1, x2, x3, x4 = x
- x_d3 = self.up1(x4, x3)
- else:
- assert(len(x) == 4)
- x0, x1, x2, x3 = x
- x_d3 = x3
- x_d2 = self.up2(x_d3, x2)
- x_d1 = self.up3(x_d2, x1)
- x_d0 = self.up4(x_d1, x0)
- output = self.out_conv(x_d0)
- if(self.mul_pred and self.stage == 'train'):
- output1 = self.out_conv1(x_d1)
- output2 = self.out_conv2(x_d2)
- output3 = self.out_conv3(x_d3)
- output = [output, output1, output2, output3]
- return output
-
-class UNet2D(nn.Module):
- """
- An implementation of 2D U-Net.
-
- * Reference: Olaf Ronneberger, Philipp Fischer, Thomas Brox:
- U-Net: Convolutional Networks for Biomedical Image Segmentation.
- MICCAI (3) 2015: 234-241
-
- Note that there are some modifications from the original paper, such as
- the use of batch normalization, dropout, leaky relu and deep supervision.
-
- Parameters are given in the `params` dictionary, and should include the
- following fields:
-
- :param in_chns: (int) Input channel number.
- :param class_num: (int) The class number for segmentation task.
-
- Optional parameters:
-
- :param feature_chns: (list) Feature channel for each resolution level.
- The length should be 4 or 5, such as [16, 32, 64, 128, 256].
- :param dropout: (list) The dropout ratio for each resolution level.
- The length should be the same as that of `feature_chns`.
- :param up_mode: (string or int) The mode for upsampling. The allowed values are:
- 0 (or `TransConv`), 1 (or `Nearest`), 2 (or `Bilinear`), 3 (or `Bicubic`).
- The default value is 2 (or `Bilinear`).
- :param multiscale_pred: (bool) Get multiscale prediction.
- """
- def __init__(self, params):
- super(UNet2D, self).__init__()
- params = self.get_default_parameters(params)
- for p in params:
- print(p, params[p])
- self.encoder = Encoder(params)
- self.decoder = Decoder(params)
-
- def get_default_parameters(self, params):
- default_param = {
- 'feature_chns': [32, 64, 128, 256, 512],
- 'dropout': [0.0, 0.0, 0.2, 0.3, 0.4],
- 'up_mode': 2,
- 'multiscale_pred': False
- }
- for key in default_param:
- params[key] = params.get(key, default_param[key])
- for key in params:
- logging.info("{0:} = {1:}".format(key, params[key]))
- return params
-
- def set_stage(self, stage):
- self.stage = stage
- self.decoder.set_stage(stage)
-
- def forward(self, x):
- x_shape = list(x.shape)
- if(len(x_shape) == 5):
- [N, C, D, H, W] = x_shape
- new_shape = [N*D, C, H, W]
- x = torch.transpose(x, 1, 2)
- x = torch.reshape(x, new_shape)
-
- f = self.encoder(x)
- output = self.decoder(f)
- if(len(x_shape) == 5):
- if(isinstance(output, (list,tuple))):
- for i in range(len(output)):
- new_shape = [N, D] + list(output[i].shape)[1:]
- output[i] = torch.transpose(torch.reshape(output[i], new_shape), 1, 2)
- else:
- new_shape = [N, D] + list(output.shape)[1:]
- output = torch.transpose(torch.reshape(output, new_shape), 1, 2)
-
- return output
\ No newline at end of file
diff --git a/pymic/net/net2d/unet2d_attention.py b/pymic/net/net2d/unet2d_attention.py
deleted file mode 100644
index 36faec8..0000000
--- a/pymic/net/net2d/unet2d_attention.py
+++ /dev/null
@@ -1,90 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-
-import torch
-import torch.nn as nn
-from pymic.net.net2d.unet2d import *
-
-class AttentionGateBlock(nn.Module):
- def __init__(self, chns_l, chns_h):
- """
- chns_l: channel number of low-level features from the encoder
- chns_h: channel number of high-level features from the decoder
- """
- super(AttentionGateBlock, self).__init__()
- self.in_chns_l = chns_l
- self.in_chns_h = chns_h
-
- self.out_chns = int(min(self.in_chns_l, self.in_chns_h)/2)
- self.conv1_l = nn.Conv2d(self.in_chns_l, self.out_chns,
- kernel_size = 1, bias = True)
- self.conv1_h = nn.Conv2d(self.in_chns_h, self.out_chns,
- kernel_size = 1, bias = True)
- self.conv2 = nn.Conv2d(self.out_chns, 1,
- kernel_size = 1, bias = True)
- self.act1 = nn.ReLU()
- self.act2 = nn.Sigmoid()
-
- def forward(self, x_l, x_h):
- input_shape = list(x_l.shape)
- gate_shape = list(x_h.shape)
-
- # resize low-level feature to the shape of high-level feature
- x_l_reshape = nn.functional.interpolate(x_l, size = gate_shape[2:], mode = 'bilinear')
- f_l = self.conv1_l(x_l_reshape)
- f_h = self.conv1_h(x_h)
- f = f_l + f_h
- f = self.act1(f)
- f = self.conv2(f)
- att = self.act2(f)
- # resize attention map to the shape of low-level feature
- att = nn.functional.interpolate(att, size = input_shape[2:], mode = 'bilinear')
- # return calibrated low-level feature
- output = att * x_l
- return output
-
-
-class UpBlockWithAttention(nn.Module):
- """Upsampling followed by ConvBlock"""
- def __init__(self, in_channels1, in_channels2, out_channels, dropout_p,
- bilinear=True):
- """
- in_channels1: channel of high-level features
- in_channels2: channel of low-level features
- out_channels: output channel number
- dropout_p: probability of dropout
- """
- super(UpBlockWithAttention, self).__init__()
- self.bilinear = bilinear
- if bilinear:
- self.conv1x1 = nn.Conv2d(in_channels1, in_channels2, kernel_size = 1)
- self.up = nn.Upsample(scale_factor=2, mode='bilinear', align_corners=True)
- else:
- self.up = nn.ConvTranspose2d(in_channels1, in_channels2, kernel_size=2, stride=2)
- self.conv = ConvBlock(in_channels2 * 2, out_channels, dropout_p)
- self.ag = AttentionGateBlock(in_channels2, in_channels1)
-
- def forward(self, x1, x2):
- x2at = self.ag(x2, x1)
- if self.bilinear:
- x1 = self.conv1x1(x1)
- x1 = self.up(x1)
- x = torch.cat([x2at, x1], dim=1)
- return self.conv(x)
-
-class AttentionUNet2D(UNet2D):
- """
- A Reimplementation of the attention U-Net paper:
- Ozan Oktay, Jo Schlemper et al.:
- Attentin U-Net: Looking Where to Look for the Pancreas. MIDL, 2018.
-
- Note that there are some modifications from the original paper, such as
- the use of batch normalization, dropout, and leaky relu here.
- """
- def __init__(self, params):
- super(AttentionUNet2D, self).__init__(params)
- self.up1 = UpBlockWithAttention(self.ft_chns[4], self.ft_chns[3], self.ft_chns[3], dropout_p = 0.0)
- self.up2 = UpBlockWithAttention(self.ft_chns[3], self.ft_chns[2], self.ft_chns[2], dropout_p = 0.0)
- self.up3 = UpBlockWithAttention(self.ft_chns[2], self.ft_chns[1], self.ft_chns[1], dropout_p = 0.0)
- self.up4 = UpBlockWithAttention(self.ft_chns[1], self.ft_chns[0], self.ft_chns[0], dropout_p = 0.0)
-
diff --git a/pymic/net/net2d/unet2d_canet.py b/pymic/net/net2d/unet2d_canet.py
deleted file mode 100644
index f578025..0000000
--- a/pymic/net/net2d/unet2d_canet.py
+++ /dev/null
@@ -1,1224 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-import numpy as np
-import torch
-import torch.nn as nn
-from torch.nn import init
-from torch.nn import functional as F
-
-## init
-def weights_init_normal(m):
- classname = m.__class__.__name__
- #print(classname)
- if classname.find('Conv') != -1:
- init.normal_(m.weight.data, 0.0, 0.02)
- elif classname.find('Linear') != -1:
- init.normal_(m.weight.data, 0.0, 0.02)
- elif classname.find('BatchNorm') != -1:
- init.normal_(m.weight.data, 1.0, 0.02)
- init.constant_(m.bias.data, 0.0)
-
-
-def weights_init_xavier(m):
- classname = m.__class__.__name__
- #print(classname)
- if classname.find('Conv') != -1:
- init.xavier_normal_(m.weight.data, gain=1)
- elif classname.find('Linear') != -1:
- init.xavier_normal_(m.weight.data, gain=1)
- elif classname.find('BatchNorm') != -1:
- init.normal_(m.weight.data, 1.0, 0.02)
- init.constant_(m.bias.data, 0.0)
-
-
-def weights_init_kaiming(m):
- classname = m.__class__.__name__
- #print(classname)
- if classname.find('Conv') != -1:
- init.kaiming_normal_(m.weight.data, a=0, mode='fan_in')
- elif classname.find('Linear') != -1:
- init.kaiming_normal_(m.weight.data, a=0, mode='fan_in')
- elif classname.find('BatchNorm') != -1:
- init.normal_(m.weight.data, 1.0, 0.02)
- init.constant_(m.bias.data, 0.0)
-
-
-def weights_init_orthogonal(m):
- classname = m.__class__.__name__
- #print(classname)
- if classname.find('Conv') != -1:
- init.orthogonal_(m.weight.data, gain=1)
- elif classname.find('Linear') != -1:
- init.orthogonal_(m.weight.data, gain=1)
- elif classname.find('BatchNorm') != -1:
- init.normal_(m.weight.data, 1.0, 0.02)
- init.constant_(m.bias.data, 0.0)
-
-
-def init_weights(net, init_type='normal'):
- #print('initialization method [%s]' % init_type)
- if init_type == 'normal':
- net.apply(weights_init_normal)
- elif init_type == 'xavier':
- net.apply(weights_init_xavier)
- elif init_type == 'kaiming':
- net.apply(weights_init_kaiming)
- elif init_type == 'orthogonal':
- net.apply(weights_init_orthogonal)
- else:
- raise NotImplementedError('initialization method [%s] is not implemented' % init_type)
-
-## 1, modules
-def conv1x1(in_planes, out_planes, stride=1, bias=False):
- "1x1 convolution"
- return nn.Conv2d(in_planes, out_planes, kernel_size=1, stride=stride,
- padding=0, bias=bias)
-
-
-def conv3x3(in_planes, out_planes, stride=1, bias=False, group=1):
- """3x3 convolution with padding"""
- return nn.Conv2d(in_planes, out_planes, kernel_size=3, stride=stride,padding=1, groups=group, bias=bias)
-
-# conv_block(nn.Module) for U-net convolution block
-class conv_block(nn.Module):
- def __init__(self, ch_in, ch_out, drop_out=False):
- super(conv_block, self).__init__()
- self.conv = nn.Sequential(
- nn.Conv2d(ch_in, ch_out, kernel_size=3, stride=1, padding=1, bias=True),
- nn.BatchNorm2d(ch_out),
- nn.ReLU(inplace=True),
- nn.Conv2d(ch_out, ch_out, kernel_size=3, stride=1, padding=1, bias=True),
- nn.BatchNorm2d(ch_out),
- nn.ReLU(inplace=True),
- )
- self.dropout = drop_out
-
- def forward(self, x):
- x = self.conv(x)
- if self.dropout:
- x = nn.Dropout2d(0.5)(x)
- return x
-
-
-# # UpCat(nn.Module) for U-net UP convolution
-class UpCat(nn.Module):
- def __init__(self, in_feat, out_feat, is_deconv=True):
- super(UpCat, self).__init__()
-
- if is_deconv:
- self.up = nn.ConvTranspose2d(in_feat, out_feat, kernel_size=2, stride=2)
- else:
- self.up = nn.Upsample(scale_factor=2, mode='bilinear')
-
- def forward(self, inputs, down_outputs):
- # TODO: Upsampling required after deconv?
- outputs = self.up(down_outputs)
- offset = inputs.size()[3] - outputs.size()[3]
- if offset == 1:
- addition = torch.rand((outputs.size()[0], outputs.size()[1], outputs.size()[2]), out=None).unsqueeze(
- 3).cuda()
- outputs = torch.cat([outputs, addition], dim=3)
- elif offset > 1:
- addition = torch.rand((outputs.size()[0], outputs.size()[1], outputs.size()[2], offset), out=None).cuda()
- outputs = torch.cat([outputs, addition], dim=3)
- out = torch.cat([inputs, outputs], dim=1)
-
- return out
-
-
-# # UpCatconv(nn.Module) for up convolution
-class UpCatconv(nn.Module):
- def __init__(self, in_feat, out_feat, is_deconv=True, drop_out=False):
- super(UpCatconv, self).__init__()
-
- if is_deconv:
- self.conv = conv_block(in_feat, out_feat, drop_out=drop_out)
- self.up = nn.ConvTranspose2d(in_feat, out_feat, kernel_size=2, stride=2)
- else:
- self.conv = conv_block(in_feat + out_feat, out_feat, drop_out=drop_out)
- self.up = nn.Upsample(scale_factor=2, mode='bilinear')
-
- def forward(self, inputs, down_outputs):
- # TODO: Upsampling required after deconv
- outputs = self.up(down_outputs)
- offset = inputs.size()[3] - outputs.size()[3]
- if offset == 1:
- addition = torch.rand((outputs.size()[0], outputs.size()[1], outputs.size()[2]), out=None).unsqueeze(
- 3).cuda()
- outputs = torch.cat([outputs, addition], dim=3)
- elif offset > 1:
- addition = torch.rand((outputs.size()[0], outputs.size()[1], outputs.size()[2], offset), out=None).cuda()
- outputs = torch.cat([outputs, addition], dim=3)
- out = self.conv(torch.cat([inputs, outputs], dim=1))
-
- return out
-
-
-
-class _GridAttentionBlockND(nn.Module):
- def __init__(self, in_channels, gating_channels, inter_channels=None, dimension=3, mode='concatenation',
- sub_sample_factor=(2,2,2)):
- super(_GridAttentionBlockND, self).__init__()
-
- assert dimension in [2, 3]
- assert mode in ['concatenation', 'concatenation_debug', 'concatenation_residual']
-
- # Downsampling rate for the input featuremap
- if isinstance(sub_sample_factor, tuple): self.sub_sample_factor = sub_sample_factor
- elif isinstance(sub_sample_factor, list): self.sub_sample_factor = tuple(sub_sample_factor)
- else: self.sub_sample_factor = tuple([sub_sample_factor]) * dimension
-
- # Default parameter set
- self.mode = mode
- self.dimension = dimension
- self.sub_sample_kernel_size = self.sub_sample_factor
-
- # Number of channels (pixel dimensions)
- self.in_channels = in_channels
- self.gating_channels = gating_channels
- self.inter_channels = inter_channels
-
- if self.inter_channels is None:
- self.inter_channels = in_channels // 2
- if self.inter_channels == 0:
- self.inter_channels = 1
-
- if dimension == 3:
- conv_nd = nn.Conv3d
- bn = nn.BatchNorm3d
- self.upsample_mode = 'trilinear'
- elif dimension == 2:
- conv_nd = nn.Conv2d
- bn = nn.BatchNorm2d
- self.upsample_mode = 'bilinear'
- else:
- raise NotImplemented
-
- # Output transform
- self.W = nn.Sequential(
- conv_nd(in_channels=self.in_channels, out_channels=self.in_channels, kernel_size=1, stride=1, padding=0),
- bn(self.in_channels),
- )
-
- # Theta^T * x_ij + Phi^T * gating_signal + bias
- self.theta = conv_nd(in_channels=self.in_channels, out_channels=self.inter_channels,
- kernel_size=self.sub_sample_kernel_size, stride=self.sub_sample_factor, padding=0, bias=True)
- self.phi = conv_nd(in_channels=self.gating_channels, out_channels=self.inter_channels,
- kernel_size=(1, 1), stride=1, padding=0, bias=True)
- self.psi = conv_nd(in_channels=self.inter_channels, out_channels=1, kernel_size=1, stride=1, padding=0, bias=True)
-
- # Initialise weights
- for m in self.children():
- init_weights(m, init_type='kaiming')
-
- # Define the operation
- if mode == 'concatenation':
- self.operation_function = self._concatenation
- elif mode == 'concatenation_debug':
- self.operation_function = self._concatenation_debug
- elif mode == 'concatenation_residual':
- self.operation_function = self._concatenation_residual
- else:
- raise NotImplementedError('Unknown operation function.')
-
-
- def forward(self, x, g):
- '''
- :param x: (b, c, t, h, w)
- :param g: (b, g_d)
- :return:
- '''
-
- output = self.operation_function(x, g)
- return output
-
- def _concatenation(self, x, g):
- input_size = x.size()
- batch_size = input_size[0]
- assert batch_size == g.size(0)
-
- # theta => (b, c, t, h, w) -> (b, i_c, t, h, w) -> (b, i_c, thw)
- # phi => (b, g_d) -> (b, i_c)
- theta_x = self.theta(x)
- theta_x_size = theta_x.size()
-
- # g (b, c, t', h', w') -> phi_g (b, i_c, t', h', w')
- # Relu(theta_x + phi_g + bias) -> f = (b, i_c, thw) -> (b, i_c, t/s1, h/s2, w/s3)
- phi_g = F.interpolate(self.phi(g), size=theta_x_size[2:], mode=self.upsample_mode)
- f = F.relu(theta_x + phi_g, inplace=True)
-
- # psi^T * f -> (b, psi_i_c, t/s1, h/s2, w/s3)
- sigm_psi_f = torch.sigmoid(self.psi(f))
-
- # upsample the attentions and multiply
- sigm_psi_f = F.interpolate(sigm_psi_f, size=input_size[2:], mode=self.upsample_mode)
- y = sigm_psi_f.expand_as(x) * x
- W_y = self.W(y)
-
- return W_y, sigm_psi_f
-
- def _concatenation_debug(self, x, g):
- input_size = x.size()
- batch_size = input_size[0]
- assert batch_size == g.size(0)
-
- # theta => (b, c, t, h, w) -> (b, i_c, t, h, w) -> (b, i_c, thw)
- # phi => (b, g_d) -> (b, i_c)
- theta_x = self.theta(x)
- theta_x_size = theta_x.size()
-
- # g (b, c, t', h', w') -> phi_g (b, i_c, t', h', w')
- # Relu(theta_x + phi_g + bias) -> f = (b, i_c, thw) -> (b, i_c, t/s1, h/s2, w/s3)
- phi_g = F.interpolate(self.phi(g), size=theta_x_size[2:], mode=self.upsample_mode)
- f = F.softplus(theta_x + phi_g)
-
- # psi^T * f -> (b, psi_i_c, t/s1, h/s2, w/s3)
- sigm_psi_f = torch.sigmoid(self.psi(f))
-
- # upsample the attentions and multiply
- sigm_psi_f = F.interpolate(sigm_psi_f, size=input_size[2:], mode=self.upsample_mode)
- y = sigm_psi_f.expand_as(x) * x
- W_y = self.W(y)
-
- return W_y, sigm_psi_f
-
-
- def _concatenation_residual(self, x, g):
- input_size = x.size()
- batch_size = input_size[0]
- assert batch_size == g.size(0)
-
- # theta => (b, c, t, h, w) -> (b, i_c, t, h, w) -> (b, i_c, thw)
- # phi => (b, g_d) -> (b, i_c)
- theta_x = self.theta(x)
- theta_x_size = theta_x.size()
-
- # g (b, c, t', h', w') -> phi_g (b, i_c, t', h', w')
- # Relu(theta_x + phi_g + bias) -> f = (b, i_c, thw) -> (b, i_c, t/s1, h/s2, w/s3)
- phi_g = F.interpolate(self.phi(g), size=theta_x_size[2:], mode=self.upsample_mode)
- f = F.relu(theta_x + phi_g, inplace=True)
-
- # psi^T * f -> (b, psi_i_c, t/s1, h/s2, w/s3)
- f = self.psi(f).view(batch_size, 1, -1)
- sigm_psi_f = F.softmax(f, dim=2).view(batch_size, 1, *theta_x.size()[2:])
-
- # upsample the attentions and multiply
- sigm_psi_f = F.interpolate(sigm_psi_f, size=input_size[2:], mode=self.upsample_mode)
- y = sigm_psi_f.expand_as(x) * x
- W_y = self.W(y)
-
- return W_y, sigm_psi_f
-
-
-class GridAttentionBlock2D(_GridAttentionBlockND):
- def __init__(self, in_channels, gating_channels, inter_channels=None, mode='concatenation',
- sub_sample_factor=(2, 2)):
- super(GridAttentionBlock2D, self).__init__(in_channels,
- inter_channels=inter_channels,
- gating_channels=gating_channels,
- dimension=2, mode=mode,
- sub_sample_factor=sub_sample_factor,
- )
-
-
-## 2, channel attention
-class SE_Conv_Block(nn.Module):
- expansion = 4
-
- def __init__(self, inplanes, planes, stride=1, downsample=None, drop_out=False):
- super(SE_Conv_Block, self).__init__()
- self.conv1 = conv3x3(inplanes, planes, stride)
- self.bn1 = nn.BatchNorm2d(planes)
- self.relu = nn.ReLU(inplace=True)
- self.conv2 = conv3x3(planes, planes * 2)
- self.bn2 = nn.BatchNorm2d(planes * 2)
- self.conv3 = conv3x3(planes * 2, planes)
- self.bn3 = nn.BatchNorm2d(planes)
- self.downsample = downsample
- self.stride = stride
- self.dropout = drop_out
-
- self.globalAvgPool = nn.AdaptiveAvgPool2d(1)
- self.globalMaxPool = nn.AdaptiveMaxPool2d(1)
-
- self.fc1 = nn.Linear(in_features=planes * 2, out_features=round(planes / 2))
- self.fc2 = nn.Linear(in_features=round(planes / 2), out_features=planes * 2)
- self.sigmoid = nn.Sigmoid()
-
- self.downchannel = None
- if inplanes != planes:
- self.downchannel = nn.Sequential(nn.Conv2d(inplanes, planes * 2, kernel_size=1, stride=stride, bias=False),
- nn.BatchNorm2d(planes * 2),)
-
- def forward(self, x):
- residual = x
-
- out = self.conv1(x)
- out = self.bn1(out)
- out = self.relu(out)
-
- out = self.conv2(out)
- out = self.bn2(out)
-
- if self.downchannel is not None:
- residual = self.downchannel(x)
-
- original_out = out
- out1 = out
- # For global average pool
- out = self.globalAvgPool(out)
- out = out.view(out.size(0), -1)
- out = self.fc1(out)
- out = self.relu(out)
- out = self.fc2(out)
- out = self.sigmoid(out)
- out = out.view(out.size(0), out.size(1), 1, 1)
- avg_att = out
- out = out * original_out
- # For global maximum pool
- out1 = self.globalMaxPool(out1)
- out1 = out1.view(out1.size(0), -1)
- out1 = self.fc1(out1)
- out1 = self.relu(out1)
- out1 = self.fc2(out1)
- out1 = self.sigmoid(out1)
- out1 = out1.view(out1.size(0), out1.size(1), 1, 1)
- max_att = out1
- out1 = out1 * original_out
-
- att_weight = avg_att + max_att
- out += out1
- out += residual
- out = self.relu(out)
-
- out = self.conv3(out)
- out = self.bn3(out)
- out = self.relu(out)
- if self.dropout:
- out = nn.Dropout2d(0.5)(out)
-
- return out, att_weight
-
-## 3, grid attention
-class _GridAttentionBlockND(nn.Module):
- def __init__(self, in_channels, gating_channels, inter_channels=None, dimension=3, mode='concatenation',
- sub_sample_factor=(2,2,2)):
- super(_GridAttentionBlockND, self).__init__()
-
- assert dimension in [2, 3]
- assert mode in ['concatenation', 'concatenation_debug', 'concatenation_residual']
-
- # Downsampling rate for the input featuremap
- if isinstance(sub_sample_factor, tuple): self.sub_sample_factor = sub_sample_factor
- elif isinstance(sub_sample_factor, list): self.sub_sample_factor = tuple(sub_sample_factor)
- else: self.sub_sample_factor = tuple([sub_sample_factor]) * dimension
-
- # Default parameter set
- self.mode = mode
- self.dimension = dimension
- self.sub_sample_kernel_size = self.sub_sample_factor
-
- # Number of channels (pixel dimensions)
- self.in_channels = in_channels
- self.gating_channels = gating_channels
- self.inter_channels = inter_channels
-
- if self.inter_channels is None:
- self.inter_channels = in_channels // 2
- if self.inter_channels == 0:
- self.inter_channels = 1
-
- if dimension == 3:
- conv_nd = nn.Conv3d
- bn = nn.BatchNorm3d
- self.upsample_mode = 'trilinear'
- elif dimension == 2:
- conv_nd = nn.Conv2d
- bn = nn.BatchNorm2d
- self.upsample_mode = 'bilinear'
- else:
- raise NotImplemented
-
- # Output transform
- self.W = nn.Sequential(
- conv_nd(in_channels=self.in_channels, out_channels=self.in_channels, kernel_size=1, stride=1, padding=0),
- bn(self.in_channels),
- )
-
- # Theta^T * x_ij + Phi^T * gating_signal + bias
- self.theta = conv_nd(in_channels=self.in_channels, out_channels=self.inter_channels,
- kernel_size=self.sub_sample_kernel_size, stride=self.sub_sample_factor, padding=0, bias=True)
- self.phi = conv_nd(in_channels=self.gating_channels, out_channels=self.inter_channels,
- kernel_size=(1, 1), stride=1, padding=0, bias=True)
- self.psi = conv_nd(in_channels=self.inter_channels, out_channels=1, kernel_size=1, stride=1, padding=0, bias=True)
-
- # Initialise weights
- for m in self.children():
- init_weights(m, init_type='kaiming')
-
- # Define the operation
- if mode == 'concatenation':
- self.operation_function = self._concatenation
- elif mode == 'concatenation_debug':
- self.operation_function = self._concatenation_debug
- elif mode == 'concatenation_residual':
- self.operation_function = self._concatenation_residual
- else:
- raise NotImplementedError('Unknown operation function.')
-
-
- def forward(self, x, g):
- '''
- :param x: (b, c, t, h, w)
- :param g: (b, g_d)
- :return:
- '''
-
- output = self.operation_function(x, g)
- return output
-
- def _concatenation(self, x, g):
- input_size = x.size()
- batch_size = input_size[0]
- assert batch_size == g.size(0)
-
- # theta => (b, c, t, h, w) -> (b, i_c, t, h, w) -> (b, i_c, thw)
- # phi => (b, g_d) -> (b, i_c)
- theta_x = self.theta(x)
- theta_x_size = theta_x.size()
-
- # g (b, c, t', h', w') -> phi_g (b, i_c, t', h', w')
- # Relu(theta_x + phi_g + bias) -> f = (b, i_c, thw) -> (b, i_c, t/s1, h/s2, w/s3)
- phi_g = F.interpolate(self.phi(g), size=theta_x_size[2:], mode=self.upsample_mode)
- f = F.relu(theta_x + phi_g, inplace=True)
-
- # psi^T * f -> (b, psi_i_c, t/s1, h/s2, w/s3)
- sigm_psi_f = torch.sigmoid(self.psi(f))
-
- # upsample the attentions and multiply
- sigm_psi_f = F.interpolate(sigm_psi_f, size=input_size[2:], mode=self.upsample_mode)
- y = sigm_psi_f.expand_as(x) * x
- W_y = self.W(y)
-
- return W_y, sigm_psi_f
-
- def _concatenation_debug(self, x, g):
- input_size = x.size()
- batch_size = input_size[0]
- assert batch_size == g.size(0)
-
- # theta => (b, c, t, h, w) -> (b, i_c, t, h, w) -> (b, i_c, thw)
- # phi => (b, g_d) -> (b, i_c)
- theta_x = self.theta(x)
- theta_x_size = theta_x.size()
-
- # g (b, c, t', h', w') -> phi_g (b, i_c, t', h', w')
- # Relu(theta_x + phi_g + bias) -> f = (b, i_c, thw) -> (b, i_c, t/s1, h/s2, w/s3)
- phi_g = F.interpolate(self.phi(g), size=theta_x_size[2:], mode=self.upsample_mode)
- f = F.softplus(theta_x + phi_g)
-
- # psi^T * f -> (b, psi_i_c, t/s1, h/s2, w/s3)
- sigm_psi_f = torch.sigmoid(self.psi(f))
-
- # upsample the attentions and multiply
- sigm_psi_f = F.interpolate(sigm_psi_f, size=input_size[2:], mode=self.upsample_mode)
- y = sigm_psi_f.expand_as(x) * x
- W_y = self.W(y)
-
- return W_y, sigm_psi_f
-
-
- def _concatenation_residual(self, x, g):
- input_size = x.size()
- batch_size = input_size[0]
- assert batch_size == g.size(0)
-
- # theta => (b, c, t, h, w) -> (b, i_c, t, h, w) -> (b, i_c, thw)
- # phi => (b, g_d) -> (b, i_c)
- theta_x = self.theta(x)
- theta_x_size = theta_x.size()
-
- # g (b, c, t', h', w') -> phi_g (b, i_c, t', h', w')
- # Relu(theta_x + phi_g + bias) -> f = (b, i_c, thw) -> (b, i_c, t/s1, h/s2, w/s3)
- phi_g = F.interpolate(self.phi(g), size=theta_x_size[2:], mode=self.upsample_mode)
- f = F.relu(theta_x + phi_g, inplace=True)
-
- # psi^T * f -> (b, psi_i_c, t/s1, h/s2, w/s3)
- f = self.psi(f).view(batch_size, 1, -1)
- sigm_psi_f = F.softmax(f, dim=2).view(batch_size, 1, *theta_x.size()[2:])
-
- # upsample the attentions and multiply
- sigm_psi_f = F.interpolate(sigm_psi_f, size=input_size[2:], mode=self.upsample_mode)
- y = sigm_psi_f.expand_as(x) * x
- W_y = self.W(y)
-
- return W_y, sigm_psi_f
-
-
-class GridAttentionBlock2D(_GridAttentionBlockND):
- def __init__(self, in_channels, gating_channels, inter_channels=None, mode='concatenation',
- sub_sample_factor=(2, 2)):
- super(GridAttentionBlock2D, self).__init__(in_channels,
- inter_channels=inter_channels,
- gating_channels=gating_channels,
- dimension=2, mode=mode,
- sub_sample_factor=sub_sample_factor,
- )
-
-class MultiAttentionBlock(nn.Module):
- def __init__(self, in_size, gate_size, inter_size, nonlocal_mode, sub_sample_factor):
- super(MultiAttentionBlock, self).__init__()
- self.gate_block_1 = GridAttentionBlock2D(in_channels=in_size, gating_channels=gate_size,
- inter_channels=inter_size, mode=nonlocal_mode,
- sub_sample_factor=sub_sample_factor)
- self.gate_block_2 = GridAttentionBlock2D(in_channels=in_size, gating_channels=gate_size,
- inter_channels=inter_size, mode=nonlocal_mode,
- sub_sample_factor=sub_sample_factor)
- self.combine_gates = nn.Sequential(nn.Conv2d(in_size*2, in_size, kernel_size=1, stride=1, padding=0),
- nn.BatchNorm2d(in_size),
- nn.ReLU(inplace=True))
-
- # initialise the blocks
- for m in self.children():
- if m.__class__.__name__.find('GridAttentionBlock2D') != -1: continue
- init_weights(m, init_type='kaiming')
-
- def forward(self, input, gating_signal):
- gate_1, attention_1 = self.gate_block_1(input, gating_signal)
- gate_2, attention_2 = self.gate_block_2(input, gating_signal)
-
- return self.combine_gates(torch.cat([gate_1, gate_2], 1)), torch.cat([attention_1, attention_2], 1)
-
-## 4, Non-local layers
-class _NonLocalBlockND(nn.Module):
- def __init__(self, in_channels, inter_channels=None, dimension=3, mode='embedded_gaussian',
- sub_sample_factor=4, bn_layer=True):
- super(_NonLocalBlockND, self).__init__()
-
- assert dimension in [1, 2, 3]
- assert mode in ['embedded_gaussian', 'gaussian', 'dot_product', 'concatenation', 'concat_proper', 'concat_proper_down']
-
- # print('Dimension: %d, mode: %s' % (dimension, mode))
-
- self.mode = mode
- self.dimension = dimension
- self.sub_sample_factor = sub_sample_factor if isinstance(sub_sample_factor, list) else [sub_sample_factor]
-
- self.in_channels = in_channels
- self.inter_channels = inter_channels
-
- if self.inter_channels is None:
- self.inter_channels = in_channels // 2
- if self.inter_channels == 0:
- self.inter_channels = 1
-
- if dimension == 3:
- conv_nd = nn.Conv3d
- max_pool = nn.MaxPool3d
- bn = nn.BatchNorm3d
- elif dimension == 2:
- conv_nd = nn.Conv2d
- max_pool = nn.MaxPool2d
- bn = nn.BatchNorm2d
- else:
- conv_nd = nn.Conv1d
- max_pool = nn.MaxPool1d
- bn = nn.BatchNorm1d
-
- self.g = conv_nd(in_channels=self.in_channels, out_channels=self.inter_channels,
- kernel_size=1, stride=1, padding=0)
-
- if bn_layer:
- self.W = nn.Sequential(
- conv_nd(in_channels=self.inter_channels, out_channels=self.in_channels,
- kernel_size=1, stride=1, padding=0),
- bn(self.in_channels)
- )
- nn.init.constant_(self.W[1].weight, 0)
- nn.init.constant_(self.W[1].bias, 0)
- else:
- self.W = conv_nd(in_channels=self.inter_channels, out_channels=self.in_channels,
- kernel_size=1, stride=1, padding=0)
- nn.init.constant_(self.W.weight, 0)
- nn.init.constant_(self.W.bias, 0)
-
- self.theta = None
- self.phi = None
-
- if mode in ['embedded_gaussian', 'dot_product', 'concatenation', 'concat_proper', 'concat_proper_down']:
- self.theta = conv_nd(in_channels=self.in_channels, out_channels=self.inter_channels,
- kernel_size=1, stride=1, padding=0)
- self.phi = conv_nd(in_channels=self.in_channels, out_channels=self.inter_channels,
- kernel_size=1, stride=1, padding=0)
-
- if mode in ['concatenation']:
- self.wf_phi = nn.Linear(self.inter_channels, 1, bias=False)
- self.wf_theta = nn.Linear(self.inter_channels, 1, bias=False)
- elif mode in ['concat_proper', 'concat_proper_down']:
- self.psi = nn.Conv2d(in_channels=self.inter_channels, out_channels=1, kernel_size=1, stride=1,
- padding=0, bias=True)
-
- if mode == 'embedded_gaussian':
- self.operation_function = self._embedded_gaussian
- elif mode == 'dot_product':
- self.operation_function = self._dot_product
- elif mode == 'gaussian':
- self.operation_function = self._gaussian
- elif mode == 'concatenation':
- self.operation_function = self._concatenation
- elif mode == 'concat_proper':
- self.operation_function = self._concatenation_proper
- elif mode == 'concat_proper_down':
- self.operation_function = self._concatenation_proper_down
- else:
- raise NotImplementedError('Unknown operation function.')
-
- if any(ss > 1 for ss in self.sub_sample_factor):
- self.g = nn.Sequential(self.g, max_pool(kernel_size=sub_sample_factor))
- if self.phi is None:
- self.phi = max_pool(kernel_size=sub_sample_factor)
- else:
- self.phi = nn.Sequential(self.phi, max_pool(kernel_size=sub_sample_factor))
- if mode == 'concat_proper_down':
- self.theta = nn.Sequential(self.theta, max_pool(kernel_size=sub_sample_factor))
-
- # Initialise weights
- for m in self.children():
- init_weights(m, init_type='kaiming')
-
- def forward(self, x):
- '''
- :param x: (b, c, t, h, w)
- :return:
- '''
-
- output = self.operation_function(x)
- return output
-
- def _embedded_gaussian(self, x):
- batch_size = x.size(0)
-
- # g=>(b, c, t, h, w)->(b, 0.5c, t, h, w)->(b, thw, 0.5c)
- g_x = self.g(x).view(batch_size, self.inter_channels, -1)
- g_x = g_x.permute(0, 2, 1)
-
- # theta=>(b, c, t, h, w)[->(b, 0.5c, t, h, w)]->(b, thw, 0.5c)
- # phi =>(b, c, t, h, w)[->(b, 0.5c, t, h, w)]->(b, 0.5c, thw)
- # f=>(b, thw, 0.5c)dot(b, 0.5c, twh) = (b, thw, thw)
- theta_x = self.theta(x).view(batch_size, self.inter_channels, -1)
- theta_x = theta_x.permute(0, 2, 1)
- phi_x = self.phi(x).view(batch_size, self.inter_channels, -1)
- f = torch.matmul(theta_x, phi_x)
- f_div_C = F.softmax(f, dim=-1)
-
- # (b, thw, thw)dot(b, thw, 0.5c) = (b, thw, 0.5c)->(b, 0.5c, t, h, w)->(b, c, t, h, w)
- y = torch.matmul(f_div_C, g_x)
- y = y.permute(0, 2, 1).contiguous()
- y = y.view(batch_size, self.inter_channels, *x.size()[2:])
- W_y = self.W(y)
- z = W_y + x
-
- return z
-
- def _gaussian(self, x):
- batch_size = x.size(0)
- g_x = self.g(x).view(batch_size, self.inter_channels, -1)
- g_x = g_x.permute(0, 2, 1)
-
- theta_x = x.view(batch_size, self.in_channels, -1)
- theta_x = theta_x.permute(0, 2, 1)
-
- if self.sub_sample_factor > 1:
- phi_x = self.phi(x).view(batch_size, self.in_channels, -1)
- else:
- phi_x = x.view(batch_size, self.in_channels, -1)
-
- f = torch.matmul(theta_x, phi_x)
- f_div_C = F.softmax(f, dim=-1)
-
- y = torch.matmul(f_div_C, g_x)
- y = y.permute(0, 2, 1).contiguous()
- y = y.view(batch_size, self.inter_channels, *x.size()[2:])
- W_y = self.W(y)
- z = W_y + x
-
- return z
-
- def _dot_product(self, x):
- batch_size = x.size(0)
-
- g_x = self.g(x).view(batch_size, self.inter_channels, -1)
- g_x = g_x.permute(0, 2, 1)
-
- theta_x = self.theta(x).view(batch_size, self.inter_channels, -1)
- theta_x = theta_x.permute(0, 2, 1)
- phi_x = self.phi(x).view(batch_size, self.inter_channels, -1)
- f = torch.matmul(theta_x, phi_x)
- N = f.size(-1)
- f_div_C = f / N
-
- y = torch.matmul(f_div_C, g_x)
- y = y.permute(0, 2, 1).contiguous()
- y = y.view(batch_size, self.inter_channels, *x.size()[2:])
- W_y = self.W(y)
- z = W_y + x
-
- return z
-
- def _concatenation(self, x):
- batch_size = x.size(0)
-
- # g=>(b, c, t, h, w)->(b, 0.5c, thw/s**2)
- g_x = self.g(x).view(batch_size, self.inter_channels, -1)
-
- # theta=>(b, c, t, h, w)[->(b, 0.5c, t, h, w)]->(b, thw, 0.5c)
- # phi =>(b, c, t, h, w)[->(b, 0.5c, t, h, w)]->(b, thw/s**2, 0.5c)
- theta_x = self.theta(x).view(batch_size, self.inter_channels, -1).permute(0, 2, 1)
- phi_x = self.phi(x).view(batch_size, self.inter_channels, -1).permute(0, 2, 1)
-
- # theta => (b, thw, 0.5c) -> (b, thw, 1) -> (b, 1, thw) -> (expand) (b, thw/s**2, thw)
- # phi => (b, thw/s**2, 0.5c) -> (b, thw/s**2, 1) -> (expand) (b, thw/s**2, thw)
- # f=> RELU[(b, thw/s**2, thw) + (b, thw/s**2, thw)] = (b, thw/s**2, thw)
- f = self.wf_theta(theta_x).permute(0, 2, 1).repeat(1, phi_x.size(1), 1) + \
- self.wf_phi(phi_x).repeat(1, 1, theta_x.size(1))
- f = F.relu(f, inplace=True)
-
- # Normalise the relations
- N = f.size(-1)
- f_div_c = f / N
-
- # g(x_j) * f(x_j, x_i)
- # (b, 0.5c, thw/s**2) * (b, thw/s**2, thw) -> (b, 0.5c, thw)
- y = torch.matmul(g_x, f_div_c)
- y = y.contiguous().view(batch_size, self.inter_channels, *x.size()[2:])
- W_y = self.W(y)
- z = W_y + x
-
- return z
-
- def _concatenation_proper(self, x):
- batch_size = x.size(0)
-
- # g=>(b, c, t, h, w)->(b, 0.5c, thw/s**2)
- g_x = self.g(x).view(batch_size, self.inter_channels, -1)
-
- # theta=>(b, c, t, h, w)[->(b, 0.5c, t, h, w)]->(b, 0.5c, thw)
- # phi =>(b, c, t, h, w)[->(b, 0.5c, t, h, w)]->(b, 0.5c, thw/s**2)
- theta_x = self.theta(x).view(batch_size, self.inter_channels, -1)
- phi_x = self.phi(x).view(batch_size, self.inter_channels, -1)
-
- # theta => (b, 0.5c, thw) -> (expand) (b, 0.5c, thw/s**2, thw)
- # phi => (b, 0.5c, thw/s**2) -> (expand) (b, 0.5c, thw/s**2, thw)
- # f=> RELU[(b, 0.5c, thw/s**2, thw) + (b, 0.5c, thw/s**2, thw)] = (b, 0.5c, thw/s**2, thw)
- f = theta_x.unsqueeze(dim=2).repeat(1,1,phi_x.size(2),1) + \
- phi_x.unsqueeze(dim=3).repeat(1,1,1,theta_x.size(2))
- f = F.relu(f, inplace=True)
-
- # psi -> W_psi^t * f -> (b, 1, thw/s**2, thw) -> (b, thw/s**2, thw)
- f = torch.squeeze(self.psi(f), dim=1)
-
- # Normalise the relations
- f_div_c = F.softmax(f, dim=1)
-
- # g(x_j) * f(x_j, x_i)
- # (b, 0.5c, thw/s**2) * (b, thw/s**2, thw) -> (b, 0.5c, thw)
- y = torch.matmul(g_x, f_div_c)
- y = y.contiguous().view(batch_size, self.inter_channels, *x.size()[2:])
- W_y = self.W(y)
- z = W_y + x
-
- return z
-
- def _concatenation_proper_down(self, x):
- batch_size = x.size(0)
-
- # g=>(b, c, t, h, w)->(b, 0.5c, thw/s**2)
- g_x = self.g(x).view(batch_size, self.inter_channels, -1)
-
- # theta=>(b, c, t, h, w)[->(b, 0.5c, t, h, w)]->(b, 0.5c, thw)
- # phi =>(b, c, t, h, w)[->(b, 0.5c, t, h, w)]->(b, 0.5c, thw/s**2)
- theta_x = self.theta(x)
- downsampled_size = theta_x.size()
- theta_x = theta_x.view(batch_size, self.inter_channels, -1)
- phi_x = self.phi(x).view(batch_size, self.inter_channels, -1)
-
- # theta => (b, 0.5c, thw) -> (expand) (b, 0.5c, thw/s**2, thw)
- # phi => (b, 0.5, thw/s**2) -> (expand) (b, 0.5c, thw/s**2, thw)
- # f=> RELU[(b, 0.5c, thw/s**2, thw) + (b, 0.5c, thw/s**2, thw)] = (b, 0.5c, thw/s**2, thw)
- f = theta_x.unsqueeze(dim=2).repeat(1,1,phi_x.size(2),1) + \
- phi_x.unsqueeze(dim=3).repeat(1,1,1,theta_x.size(2))
- f = F.relu(f, inplace=True)
-
- # psi -> W_psi^t * f -> (b, 0.5c, thw/s**2, thw) -> (b, 1, thw/s**2, thw) -> (b, thw/s**2, thw)
- f = torch.squeeze(self.psi(f), dim=1)
-
- # Normalise the relations
- f_div_c = F.softmax(f, dim=1)
-
- # g(x_j) * f(x_j, x_i)
- # (b, 0.5c, thw/s**2) * (b, thw/s**2, thw) -> (b, 0.5c, thw)
- y = torch.matmul(g_x, f_div_c)
- y = y.contiguous().view(batch_size, self.inter_channels, *downsampled_size[2:])
-
- # upsample the final featuremaps # (b,0.5c,t/s1,h/s2,w/s3)
- y = F.interpolate(y, size=x.size()[2:], mode='trilinear')
-
- # attention block output
- W_y = self.W(y)
- z = W_y + x
-
- return z
-
-
-class NONLocalBlock2D(_NonLocalBlockND):
- def __init__(self, in_channels, inter_channels=None, mode='embedded_gaussian', sub_sample_factor=2, bn_layer=True):
- super(NONLocalBlock2D, self).__init__(in_channels,
- inter_channels=inter_channels,
- dimension=2, mode=mode,
- sub_sample_factor=sub_sample_factor,
- bn_layer=bn_layer)
-
-## 5, scale attention
-class BasicConv(nn.Module):
- def __init__(self, in_planes, out_planes, kernel_size, stride=1, padding=0, dilation=1, groups=1,
- relu=True, bn=True, bias=False):
- super(BasicConv, self).__init__()
- self.out_channels = out_planes
- self.conv = nn.Conv2d(in_planes, out_planes, kernel_size=kernel_size, stride=stride, padding=padding,
- dilation=dilation, groups=groups, bias=bias)
- self.bn = nn.BatchNorm2d(out_planes, eps=1e-5, momentum=0.01, affine=True) if bn else None
- self.relu = nn.ReLU() if relu else None
-
- def forward(self, x):
- x = self.conv(x)
- if self.bn is not None:
- x = self.bn(x)
- if self.relu is not None:
- x = self.relu(x)
- return x
-
-
-class Flatten(nn.Module):
- def forward(self, x):
- return x.view(x.size(0), -1)
-
-
-class ChannelGate(nn.Module):
- def __init__(self, gate_channels, reduction_ratio=16, pool_types=['avg', 'max']):
- super(ChannelGate, self).__init__()
- self.gate_channels = gate_channels
- self.mlp = nn.Sequential(
- Flatten(),
- nn.Linear(gate_channels, gate_channels // reduction_ratio),
- nn.ReLU(),
- nn.Linear(gate_channels // reduction_ratio, gate_channels)
- )
- self.pool_types = pool_types
-
- def forward(self, x):
- channel_att_sum = None
- for pool_type in self.pool_types:
- if pool_type == 'avg':
- avg_pool = F.avg_pool2d(x, (x.size(2), x.size(3)), stride=(x.size(2), x.size(3)))
- channel_att_raw = self.mlp(avg_pool)
- elif pool_type == 'max':
- max_pool = F.max_pool2d(x, (x.size(2), x.size(3)), stride=(x.size(2), x.size(3)))
- channel_att_raw = self.mlp(max_pool)
- elif pool_type == 'lp':
- lp_pool = F.lp_pool2d(x, 2, (x.size(2), x.size(3)), stride=(x.size(2), x.size(3)))
- channel_att_raw = self.mlp(lp_pool)
- elif pool_type == 'lse':
- # LSE pool only
- lse_pool = logsumexp_2d(x)
- channel_att_raw = self.mlp(lse_pool)
-
- if channel_att_sum is None:
- channel_att_sum = channel_att_raw
- else:
- channel_att_sum = channel_att_sum + channel_att_raw
-
- # scalecoe = F.sigmoid(channel_att_sum)
- channel_att_sum = channel_att_sum.reshape(channel_att_sum.shape[0], 4, 4)
- avg_weight = torch.mean(channel_att_sum, dim=2).unsqueeze(2)
- avg_weight = avg_weight.expand(channel_att_sum.shape[0], 4, 4).reshape(channel_att_sum.shape[0], 16)
- scale = torch.sigmoid(avg_weight).unsqueeze(2).unsqueeze(3).expand_as(x)
-
- return x * scale, scale
-
-
-def logsumexp_2d(tensor):
- tensor_flatten = tensor.view(tensor.size(0), tensor.size(1), -1)
- s, _ = torch.max(tensor_flatten, dim=2, keepdim=True)
- outputs = s + (tensor_flatten - s).exp().sum(dim=2, keepdim=True).log()
- return outputs
-
-
-class ChannelPool(nn.Module):
- def forward(self, x):
- return torch.cat((torch.max(x, 1)[0].unsqueeze(1), torch.mean(x, 1).unsqueeze(1)), dim=1)
-
-
-class SpatialGate(nn.Module):
- def __init__(self):
- super(SpatialGate, self).__init__()
- kernel_size = 7
- self.compress = ChannelPool()
- self.spatial = BasicConv(2, 1, kernel_size, stride=1, padding=(kernel_size-1) // 2, relu=False)
-
- def forward(self, x):
- x_compress = self.compress(x)
- x_out = self.spatial(x_compress)
- scale = torch.sigmoid(x_out) # broadcasting
- # spa_scale = scale.expand_as(x)
- # print(spa_scale.shape)
- return x * scale, scale
-
-class SpatialAtten(nn.Module):
- def __init__(self, in_size, out_size, kernel_size=3, stride=1):
- super(SpatialAtten, self).__init__()
- self.conv1 = BasicConv(in_size, out_size, kernel_size, stride=stride,
- padding=(kernel_size-1) // 2, relu=True)
- self.conv2 = BasicConv(out_size, out_size, kernel_size=1, stride=stride,
- padding=0, relu=True, bn=False)
-
- def forward(self, x):
- residual = x
- x_out = self.conv1(x)
- x_out = self.conv2(x_out)
- spatial_att = torch.sigmoid(x_out).unsqueeze(4).permute(0, 1, 4, 2, 3)
- spatial_att = spatial_att.expand(spatial_att.shape[0], 4, 4, spatial_att.shape[3], spatial_att.shape[4]).reshape(
- spatial_att.shape[0], 16, spatial_att.shape[3], spatial_att.shape[4])
- x_out = residual * spatial_att
-
- x_out += residual
-
- return x_out, spatial_att
-
-class Scale_atten_block(nn.Module):
- def __init__(self, gate_channels, reduction_ratio=16, pool_types=['avg', 'max'], no_spatial=False):
- super(Scale_atten_block, self).__init__()
- self.ChannelGate = ChannelGate(gate_channels, reduction_ratio, pool_types)
- self.no_spatial = no_spatial
- if not no_spatial:
- self.SpatialGate = SpatialAtten(gate_channels, gate_channels //reduction_ratio)
-
- def forward(self, x):
- x_out, ca_atten = self.ChannelGate(x)
- if not self.no_spatial:
- x_out, sa_atten = self.SpatialGate(x_out)
-
- return x_out, ca_atten, sa_atten
-
-
-class scale_atten_convblock(nn.Module):
- def __init__(self, in_size, out_size, stride=1, downsample=None, use_cbam=True, no_spatial=False, drop_out=False):
- super(scale_atten_convblock, self).__init__()
- # if stride != 1 or in_size != out_size:
- # downsample = nn.Sequential(
- # nn.Conv2d(in_size, out_size,
- # kernel_size=1, stride=stride, bias=False),
- # nn.BatchNorm2d(out_size),
- # )
- self.downsample = downsample
- self.stride = stride
- self.no_spatial = no_spatial
- self.dropout = drop_out
-
- self.relu = nn.ReLU(inplace=True)
- self.conv3 = conv3x3(in_size, out_size)
- self.bn3 = nn.BatchNorm2d(out_size)
-
- if use_cbam:
- self.cbam = Scale_atten_block(in_size, reduction_ratio=4, no_spatial=self.no_spatial) # out_size
- else:
- self.cbam = None
-
- def forward(self, x):
- residual = x
-
- if self.downsample is not None:
- residual = self.downsample(x)
-
- if not self.cbam is None:
- out, scale_c_atten, scale_s_atten = self.cbam(x)
-
- # scale_c_atten = nn.Sigmoid()(scale_c_atten)
- # scale_s_atten = nn.Sigmoid()(scale_s_atten)
- # scale_atten = channel_atten_c * spatial_atten_s
-
- # scale_max = torch.argmax(scale_atten, dim=1, keepdim=True)
- # scale_max_soft = get_soft_label(input_tensor=scale_max, num_class=8)
- # scale_max_soft = scale_max_soft.permute(0, 3, 1, 2)
- # scale_atten_soft = scale_atten * scale_max_soft
-
- out += residual
- out = self.relu(out)
- out = self.conv3(out)
- out = self.bn3(out)
- out = self.relu(out)
-
- if self.dropout:
- out = nn.Dropout2d(0.5)(out)
-
- return out
-
-## 6, CANet
-class CANet(nn.Module):
- """
- Implementation of CANet (Comprehensive Attention Network) for image segmentation.
-
- * Reference: R. Gu et al. `CA-Net: Comprehensive Attention Convolutional Neural Networks
- for Explainable Medical Image Segmentation `_.
- IEEE Transactions on Medical Imaging, 40(2),2021:699-711.
-
- Parameters are given in the `params` dictionary, and should include the
- following fields:
-
- :param in_chns: (int) Input channel number.
- :param feature_chns: (list) Feature channel for each resolution level.
- The length should be 5, such as [16, 32, 64, 128, 256].
- :param class_num: (int) The class number for segmentation task.
- :param is_deconv: (bool) Using deconvolution for up-sampling or not.
- If False, bilinear interpolation will be used for up-sampling. Default is True.
- :param is_batchnorm: (bool) If batch normalization is or not. Default is True.
- :param feature_scale: (int) The scale of resolution levels. Default is 4.
- """
- def __init__(self, params): #args, in_ch=3, n_classes=2, feature_scale=4, is_deconv=True, is_batchnorm=True,
- # nonlocal_mode='concatenation', attention_dsample=(1, 1)):
- super(CANet, self).__init__()
- self.in_channels = params['in_chns']
- self.num_classes = params['class_num']
- self.feature_chns= params.get('feature_chns', [32, 64, 128, 256, 512])
- self.is_deconv = params.get('is_deconv', True)
- self.is_batchnorm = params.get('is_batchnorm', True)
- self.feature_scale = params.get('feature_scale', 4)
- nonlocal_mode = 'concatenation'
- attention_dsample = (1, 1)
-
- filters = self.feature_chns
- filters = [int(x / self.feature_scale) for x in filters]
-
- # downsampling
- self.conv1 = conv_block(self.in_channels, filters[0])
- self.maxpool1 = nn.MaxPool2d(kernel_size=(2, 2))
-
- self.conv2 = conv_block(filters[0], filters[1])
- self.maxpool2 = nn.MaxPool2d(kernel_size=(2, 2))
-
- self.conv3 = conv_block(filters[1], filters[2])
- self.maxpool3 = nn.MaxPool2d(kernel_size=(2, 2))
-
- self.conv4 = conv_block(filters[2], filters[3], drop_out=True)
- self.maxpool4 = nn.MaxPool2d(kernel_size=(2, 2))
-
- self.center = conv_block(filters[3], filters[4], drop_out=True)
-
- # attention blocks
- # self.attentionblock1 = GridAttentionBlock2D(in_channels=filters[0], gating_channels=filters[1],
- # inter_channels=filters[0])
- self.attentionblock2 = MultiAttentionBlock(in_size=filters[1], gate_size=filters[2], inter_size=filters[1],
- nonlocal_mode=nonlocal_mode, sub_sample_factor=attention_dsample)
- self.attentionblock3 = MultiAttentionBlock(in_size=filters[2], gate_size=filters[3], inter_size=filters[2],
- nonlocal_mode=nonlocal_mode, sub_sample_factor=attention_dsample)
- self.nonlocal4_2 = NONLocalBlock2D(in_channels=filters[4], inter_channels=filters[4] // 4)
-
- # upsampling
- self.up_concat4 = UpCat(filters[4], filters[3], self.is_deconv)
- self.up_concat3 = UpCat(filters[3], filters[2], self.is_deconv)
- self.up_concat2 = UpCat(filters[2], filters[1], self.is_deconv)
- self.up_concat1 = UpCat(filters[1], filters[0], self.is_deconv)
- self.up4 = SE_Conv_Block(filters[4], filters[3], drop_out=True)
- self.up3 = SE_Conv_Block(filters[3], filters[2])
- self.up2 = SE_Conv_Block(filters[2], filters[1])
- self.up1 = SE_Conv_Block(filters[1], filters[0])
-
- # For deep supervision, project the multi-scale feature maps to the same number of channels
- self.dsv1 = nn.Conv2d(in_channels=filters[0], out_channels=filters[0]//2, kernel_size=1)
- self.dsv2 = nn.Conv2d(in_channels=filters[1], out_channels=filters[0]//2, kernel_size=1)
- self.dsv3 = nn.Conv2d(in_channels=filters[2], out_channels=filters[0]//2, kernel_size=1)
- self.dsv4 = nn.Conv2d(in_channels=filters[3], out_channels=filters[0]//2, kernel_size=1)
-
- self.scale_att = scale_atten_convblock(in_size=filters[0]//2 * 4, out_size=filters[0])
- self.final = nn.Conv2d(filters[0], self.num_classes, kernel_size=1)
-
- def forward(self, inputs):
- x_shape = list(inputs.shape)
- if(len(x_shape) == 5):
- [N, C, D, H, W] = x_shape
- new_shape = [N*D, C, H, W]
- inputs = torch.transpose(inputs, 1, 2)
- inputs = torch.reshape(inputs, new_shape)
-
- # Feature Extraction
- conv1 = self.conv1(inputs)
- maxpool1 = self.maxpool1(conv1)
-
- conv2 = self.conv2(maxpool1)
- maxpool2 = self.maxpool2(conv2)
-
- conv3 = self.conv3(maxpool2)
- maxpool3 = self.maxpool3(conv3)
-
- conv4 = self.conv4(maxpool3)
- maxpool4 = self.maxpool4(conv4)
-
- # Gating Signal Generation
- center = self.center(maxpool4)
-
- # Attention Mechanism
- # Upscaling Part (Decoder)
- up4 = self.up_concat4(conv4, center)
- g_conv4 = self.nonlocal4_2(up4)
-
- up4, att_weight4 = self.up4(g_conv4)
- g_conv3, att3 = self.attentionblock3(conv3, up4)
-
- # atten3_map = att3.cpu().detach().numpy().astype(np.float)
- # atten3_map = ndimage.interpolation.zoom(atten3_map, [1.0, 1.0, 224 / atten3_map.shape[2],
- # 300 / atten3_map.shape[3]], order=0)
-
- up3 = self.up_concat3(g_conv3, up4)
- up3, att_weight3 = self.up3(up3)
- g_conv2, att2 = self.attentionblock2(conv2, up3)
-
- up2 = self.up_concat2(g_conv2, up3)
- up2, att_weight2 = self.up2(up2)
-
- up1 = self.up_concat1(conv1, up2)
- up1, att_weight1 = self.up1(up1)
-
- # Deep Supervision
- dsv1 = self.dsv1(up1)
- dsv2 = F.interpolate(self.dsv2(up2), dsv1.shape[2:], mode = 'bilinear')
- dsv3 = F.interpolate(self.dsv3(up3), dsv1.shape[2:], mode = 'bilinear')
- dsv4 = F.interpolate(self.dsv4(up4), dsv1.shape[2:], mode = 'bilinear')
-
- dsv_cat = torch.cat([dsv1, dsv2, dsv3, dsv4], dim=1)
- out = self.scale_att(dsv_cat)
-
- out = self.final(out)
- if(len(x_shape) == 5):
- if(isinstance(out, (list,tuple))):
- for i in range(len(out)):
- new_shape = [N, D] + list(out[i].shape)[1:]
- out[i] = torch.transpose(torch.reshape(out[i], new_shape), 1, 2)
- else:
- new_shape = [N, D] + list(out.shape)[1:]
- out = torch.transpose(torch.reshape(out, new_shape), 1, 2)
-
- return out
-
-if __name__ == "__main__":
- params = {'in_chns':3,
- 'class_num':2}
- Net = CANet(params)
- Net = Net.double()
-
- x = np.random.rand(4, 3, 224, 224)
- xt = torch.from_numpy(x)
- xt = xt.clone().detach()
-
- y = Net(xt)
- print(len(y.size()))
- y = y.detach().numpy()
- print(y.shape)
diff --git a/pymic/net/net2d/unet2d_cct.py b/pymic/net/net2d/unet2d_cct.py
deleted file mode 100644
index b3aa557..0000000
--- a/pymic/net/net2d/unet2d_cct.py
+++ /dev/null
@@ -1,159 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-
-import torch
-import torch.nn as nn
-import torch.nn.functional as F
-import numpy as np
-from torch.distributions.uniform import Uniform
-from pymic.net.net2d.unet2d import Encoder, Decoder
-
-def _l2_normalize(d):
- """Normalizing per batch axis"""
- d_reshaped = d.view(d.shape[0], -1, *(1 for _ in range(d.dim() - 2)))
- d /= torch.norm(d_reshaped, dim=1, keepdim=True) + 1e-8
- return d
-
-
-def _get_r_adv(x_list, decoder, it=1, xi=1e-1, eps=10.0):
- """
- Virtual Adversarial Training according to
- https://arxiv.org/abs/1704.03976
- """
- x_detached = [item.detach() for item in x_list]
- xe_detached = x_detached[-1]
- with torch.no_grad():
- pred = F.softmax(decoder(x_detached), dim=1)
-
- d = torch.rand(x_list[-1].shape).sub(0.5).to(x_list[-1].device)
- d = _l2_normalize(d)
-
- for _ in range(it):
- d.requires_grad_()
- x_detached[-1] = xe_detached + xi * d
- pred_hat = decoder(x_detached)
- logp_hat = F.log_softmax(pred_hat, dim=1)
- adv_distance = F.kl_div(logp_hat, pred, reduction='batchmean')
- adv_distance.backward()
- d = _l2_normalize(d.grad)
- decoder.zero_grad()
-
- r_adv = d * eps
- return x_list[-1] + r_adv
-
-
-class AuxiliaryDecoder(nn.Module):
- """
- An Auxiliary Decoder.
- `aux_type` should be one of {`DropOut`, `FeatureDrop`, `FeatureNoise` and `VAT`}.
- Other parameters for the decoder are given in the `params` dictionary,
- see :mod:`pymic.net.net2d.unet2d.Decoder` for details.
- In addition, the following fields are needed for pertubation:
-
- :param Uniform_range: (float) The range of noise. Only needed when `aux_type`=`FeatureNoise`.
- :param VAT_it: (float) The iteration number of VAT. Only needed when `aux_type`=`VAT`.
- :param VAT_xi: (float) The hyper-parameter xi of VAT. Only needed when `aux_type`=`VAT`.
- :param VAT_eps: (float) The hyper-parameter eps of VAT. Only needed when `aux_type`=`VAT`.
-
- """
- def __init__(self, params, aux_type):
- super(AuxiliaryDecoder, self).__init__()
- self.params = params
- self.decoder = Decoder(params)
- self.aux_type = aux_type
- uniform_range = params.get("Uniform_range".lower(), 0.3)
- self.uni_dist = Uniform(-uniform_range, uniform_range)
-
- def feature_drop(self, x):
- attention = torch.mean(x, dim=1, keepdim=True)
- max_val, _ = torch.max(attention.view(x.size(0), -1), dim=1, keepdim=True)
- threshold = max_val * np.random.uniform(0.7, 0.9)
- threshold = threshold.view(x.size(0), 1, 1, 1).expand_as(attention)
- drop_mask = (attention < threshold).float()
- return x.mul(drop_mask)
-
- def feature_based_noise(self, x):
- noise_vector = self.uni_dist.sample(x.shape[1:]).to(x.device).unsqueeze(0)
- x_noise = x.mul(noise_vector) + x
- return x_noise
-
- def forward(self, x):
- if(self.aux_type == "DropOut"):
- pass
- elif(self.aux_type == "FeatureDrop"):
- x[-1] = self.feature_drop(x[-1])
- elif(self.aux_type == "FeatureNoise"):
- x[-1] = self.feature_based_noise(x[-1])
- elif(self.aux_type == "VAT"):
- it = self.params.get("VAT_it".lower(), 2)
- xi = self.params.get("VAT_xi".lower(), 1e-6)
- eps= self.params.get("VAT_eps".lower(), 2.0)
- x[-1] = _get_r_adv(x, self.decoder, it, xi, eps)
- else:
- raise ValueError("Undefined auxiliary decoder type {0:}".format(self.aux_type))
-
- output = self.decoder(x)
- return output
-
-
-class UNet2D_CCT(nn.Module):
- """
- An modification the U-Net with auxiliary decoders according to
- the CCT paper.
-
- * Reference: Yassine Ouali, Celine Hudelot and Myriam Tami:
- Semi-Supervised Semantic Segmentation With Cross-Consistency Training.
- `CVPR 2020. `_
-
- Code adapted from `Github. `_
-
- Parameter for the network backbone are given in the `params` dictionary,
- see :mod:`pymic.net.net2d.unet2d.UNet2D` for details.
- In addition, the following fields are needed for pertubation
- in the auxiliary decoders:
-
- :param CCT_aux_decoders: (list) A list of auxiliary decoder types.
- Supported values are {`DropOut`, `FeatureDrop`, `FeatureNoise` and `VAT`}.
-
- The parameters for different types of auxiliary decoders should also be
- given in the `params` dictionary,
- see :mod:`pymic.net.net2d.unet2d_cct.AuxiliaryDecoder` for details.
- """
- def __init__(self, params):
- super(UNet2D_CCT, self).__init__()
- self.params = params
- self.encoder = Encoder(params)
- self.decoder = Decoder(params)
- aux_names = params.get("CCT_aux_decoders".lower(), None)
- if aux_names is None:
- aux_names = ["DropOut", "FeatureDrop", "FeatureNoise", "VAT"]
- aux_decoders = []
- for aux_name in aux_names:
- aux_decoders.append(AuxiliaryDecoder(params, aux_name))
- self.aux_decoders = nn.ModuleList(aux_decoders)
-
-
- def forward(self, x):
- x_shape = list(x.shape)
- if(len(x_shape) == 5):
- [N, C, D, H, W] = x_shape
- new_shape = [N*D, C, H, W]
- x = torch.transpose(x, 1, 2)
- x = torch.reshape(x, new_shape)
-
- f = self.encoder(x)
- output = self.decoder(f)
- if(len(x_shape) == 5):
- new_shape = [N, D] + list(output.shape)[1:]
- output = torch.reshape(output, new_shape)
- output = torch.transpose(output, 1, 2)
-
- if(self.training):
- aux_outputs = [aux_d(f) for aux_d in self.aux_decoders]
- if(len(x_shape) == 5):
- for i in range(len(aux_outputs)):
- aux_outi = torch.reshape(aux_outputs[i], new_shape)
- aux_outputs[i] = torch.transpose(aux_outi, 1, 2)
- return output, aux_outputs
- else:
- return output
\ No newline at end of file
diff --git a/pymic/net/net2d/unet2d_dual_branch.py b/pymic/net/net2d/unet2d_dual_branch.py
deleted file mode 100644
index 19a0788..0000000
--- a/pymic/net/net2d/unet2d_dual_branch.py
+++ /dev/null
@@ -1,74 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-
-import torch
-import torch.nn as nn
-from pymic.net.net2d.unet2d import *
-
-class UNet2D_DualBranch(nn.Module):
- """
- A dual branch network using UNet2D as backbone.
-
- * Reference: Xiangde Luo, Minhao Hu, Wenjun Liao, Shuwei Zhai, Tao Song, Guotai Wang,
- Shaoting Zhang. ScribblScribble-Supervised Medical Image Segmentation via
- Dual-Branch Network and Dynamically Mixed Pseudo Labels Supervision.
- `MICCAI 2022. `_
-
- The parameters for the backbone should be given in the `params` dictionary.
- See :mod:`pymic.net.net2d.unet2d.UNet2D` for details.
- In addition, the following field should be included:
-
- :param output_mode: (str) How to obtain the result during the inference.
- `average`: taking average of the two branches.
- `first`: takeing the result in the first branch.
- `second`: taking the result in the second branch.
- """
- def __init__(self, params):
- super(UNet2D_DualBranch, self).__init__()
- params = self.get_default_parameters(params)
- self.output_mode = params["output_mode"]
- self.encoder = Encoder(params)
- self.decoder1 = Decoder(params)
- self.decoder2 = Decoder(params)
-
- def get_default_parameters(self, params):
- default_param = {
- 'feature_chns': [32, 64, 128, 256, 512],
- 'dropout': [0.0, 0.0, 0.2, 0.3, 0.4],
- 'up_mode': 2,
- 'multiscale_pred': False,
- 'output_mode': "average"
- }
- for key in default_param:
- params[key] = params.get(key, default_param[key])
- for key in params:
- logging.info("{0:} = {1:}".format(key, params[key]))
- return params
-
- def forward(self, x):
- x_shape = list(x.shape)
- if(len(x_shape) == 5):
- [N, C, D, H, W] = x_shape
- new_shape = [N*D, C, H, W]
- x = torch.transpose(x, 1, 2)
- x = torch.reshape(x, new_shape)
-
- f = self.encoder(x)
- output1 = self.decoder1(f)
- output2 = self.decoder2(f)
- if(len(x_shape) == 5):
- new_shape = [N, D] + list(output1.shape)[1:]
- output1 = torch.reshape(output1, new_shape)
- output1 = torch.transpose(output1, 1, 2)
- output2 = torch.reshape(output2, new_shape)
- output2 = torch.transpose(output2, 1, 2)
-
- if(self.training):
- return output1, output2
- else:
- if(self.output_mode == "average"):
- return (output1 + output2)/2
- elif(self.output_mode == "first"):
- return output1
- else:
- return output2
diff --git a/pymic/net/net2d/unet2d_mcnet.py b/pymic/net/net2d/unet2d_mcnet.py
deleted file mode 100644
index be5b16b..0000000
--- a/pymic/net/net2d/unet2d_mcnet.py
+++ /dev/null
@@ -1,66 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-
-import torch.nn as nn
-from pymic.net.net2d.unet2d import *
-
-class MCNet2D(nn.Module):
- """
- A tri-branch network using UNet2D as backbone.
-
- * Reference: Yicheng Wu, Zongyuan Ge et al. Mutual consistency learning for
- semi-supervised medical image segmentation.
- `Medical Image Analysis 2022. `_
-
- The original code is at: https://github.com/ycwu1997/MC-Net
-
- The parameters for the backbone should be given in the `params` dictionary.
- See :mod:`pymic.net.net2d.unet2d.UNet2D` for details.
- """
- def __init__(self, params):
- super(MCNet2D, self).__init__()
- in_chns = params['in_chns']
- class_num = params['class_num']
- params1 = {'in_chns': in_chns,
- 'feature_chns': [16, 32, 64, 128, 256],
- 'dropout': [0.05, 0.1, 0.2, 0.3, 0.5],
- 'class_num': class_num,
- 'up_mode': 0,
- 'multiscale_pred': False }
- params2 = {'in_chns': in_chns,
- 'feature_chns': [16, 32, 64, 128, 256],
- 'dropout': [0.05, 0.1, 0.2, 0.3, 0.5],
- 'class_num': class_num,
- 'up_mode': 1,
- 'multiscale_pred': False}
- params3 = {'in_chns': in_chns,
- 'feature_chns': [16, 32, 64, 128, 256],
- 'dropout': [0.05, 0.1, 0.2, 0.3, 0.5],
- 'class_num': class_num,
- 'up_mode': 2,
- 'multiscale_pred': False}
- self.encoder = Encoder(params1)
- self.decoder1 = Decoder(params1)
- self.decoder2 = Decoder(params2)
- self.decoder3 = Decoder(params3)
-
- def forward(self, x):
- x_shape = list(x.shape)
- if(len(x_shape) == 5):
- [N, C, D, H, W] = x_shape
- new_shape = [N*D, C, H, W]
- x = torch.transpose(x, 1, 2)
- x = torch.reshape(x, new_shape)
-
- feature = self.encoder(x)
- output1 = self.decoder1(feature)
- new_shape = [N, D] + list(output1.shape)[1:]
- output1 = torch.transpose(torch.reshape(output1, new_shape), 1, 2)
- if(not self.training):
- return output1
- output2 = self.decoder2(feature)
- output3 = self.decoder3(feature)
- if(len(x_shape) == 5):
- output2 = torch.transpose(torch.reshape(output2, new_shape), 1, 2)
- output3 = torch.transpose(torch.reshape(output3, new_shape), 1, 2)
- return output1, output2, output3
diff --git a/pymic/net/net2d/unet2d_multi_decoder.py b/pymic/net/net2d/unet2d_multi_decoder.py
deleted file mode 100644
index 03bd99f..0000000
--- a/pymic/net/net2d/unet2d_multi_decoder.py
+++ /dev/null
@@ -1,163 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-
-import torch
-import torch.nn as nn
-from pymic.net.net2d.unet2d import *
-
-class UNet2D_DualBranch(nn.Module):
- """
- A dual branch network using UNet2D as backbone.
-
- * Reference: Xiangde Luo, Minhao Hu, Wenjun Liao, Shuwei Zhai, Tao Song, Guotai Wang,
- Shaoting Zhang. ScribblScribble-Supervised Medical Image Segmentation via
- Dual-Branch Network and Dynamically Mixed Pseudo Labels Supervision.
- `MICCAI 2022. `_
-
- The parameters for the backbone should be given in the `params` dictionary.
- See :mod:`pymic.net.net2d.unet2d.UNet2D` for details.
- In addition, the following field should be included:
-
- :param output_mode: (str) How to obtain the result during the inference.
- `average`: taking average of the two branches.
- `first`: takeing the result in the first branch.
- `second`: taking the result in the second branch.
- """
- def __init__(self, params):
- super(UNet2D_DualBranch, self).__init__()
- params = self.get_default_parameters(params)
- self.output_mode = params["output_mode"]
- self.encoder = Encoder(params)
- self.decoder1 = Decoder(params)
- self.decoder2 = Decoder(params)
-
- def get_default_parameters(self, params):
- default_param = {
- 'feature_chns': [32, 64, 128, 256, 512],
- 'dropout': [0.0, 0.0, 0.2, 0.3, 0.4],
- 'up_mode': 2,
- 'multiscale_pred': False,
- 'output_mode': "average"
- }
- for key in default_param:
- params[key] = params.get(key, default_param[key])
- for key in params:
- logging.info("{0:} = {1:}".format(key, params[key]))
- return params
-
- def forward(self, x):
- x_shape = list(x.shape)
- if(len(x_shape) == 5):
- [N, C, D, H, W] = x_shape
- new_shape = [N*D, C, H, W]
- x = torch.transpose(x, 1, 2)
- x = torch.reshape(x, new_shape)
-
- f = self.encoder(x)
- output1 = self.decoder1(f)
- output2 = self.decoder2(f)
- if(len(x_shape) == 5):
- new_shape = [N, D] + list(output1.shape)[1:]
- output1 = torch.reshape(output1, new_shape)
- output1 = torch.transpose(output1, 1, 2)
- output2 = torch.reshape(output2, new_shape)
- output2 = torch.transpose(output2, 1, 2)
-
- return output1, output2
- # if(self.training):
- # return output1, output2
- # else:
- # if(self.output_mode == "average"):
- # return (output1 + output2)/2
- # elif(self.output_mode == "first"):
- # return output1
- # else:
- # return output2
-
-class UNet2D_TriBranch(nn.Module):
- """
- A tri-branch network using UNet2D as backbone. The super class for MCNet2D and MTNet2D.
-
- The parameters for the backbone should be given in the `params` dictionary.
- See :mod:`pymic.net.net2d.unet2d.UNet2D` for details.
- """
- def __init__(self, params):
- super(UNet2D_TriBranch, self).__init__()
- params = self.get_default_parameters(params)
- self.encoder = Encoder(params)
- self.decoder1 = Decoder(params)
- self.decoder2 = Decoder(params)
- self.decoder3 = Decoder(params)
-
- def get_default_parameters(self, params):
- default_param = {
- 'feature_chns': [32, 64, 128, 256, 512],
- 'dropout': [0.0, 0.0, 0.2, 0.3, 0.4],
- 'up_mode': 2,
- 'multiscale_pred': False,
- }
- for key in default_param:
- params[key] = params.get(key, default_param[key])
- for key in params:
- logging.info("{0:} = {1:}".format(key, params[key]))
- return params
-
- def forward(self, x):
- x_shape = list(x.shape)
- if(len(x_shape) == 5):
- [N, C, D, H, W] = x_shape
- new_shape = [N*D, C, H, W]
- x = torch.transpose(x, 1, 2)
- x = torch.reshape(x, new_shape)
-
- feature = self.encoder(x)
- output1 = self.decoder1(feature)
- new_shape = [N, D] + list(output1.shape)[1:]
- output1 = torch.transpose(torch.reshape(output1, new_shape), 1, 2)
- if(not self.training):
- return output1
- output2 = self.decoder2(feature)
- output3 = self.decoder3(feature)
- if(len(x_shape) == 5):
- output2 = torch.transpose(torch.reshape(output2, new_shape), 1, 2)
- output3 = torch.transpose(torch.reshape(output3, new_shape), 1, 2)
- return output1, output2, output3
-
-class MCNet2D(UNet2D_TriBranch):
- """
- A tri-branch network using UNet2D as backbone.
-
- * Reference: Yicheng Wu, Zongyuan Ge et al. Mutual consistency learning for
- semi-supervised medical image segmentation.
- `Medical Image Analysis 2022. `_
-
- The original code is at: https://github.com/ycwu1997/MC-Net
-
- The parameters for the backbone should be given in the `params` dictionary.
- See :mod:`pymic.net.net2d.unet2d.UNet2D` for details.
- """
- def __init__(self, params):
- super(MCNet2D, self).__init__(params)
- in_chns = params['in_chns']
- class_num = params['class_num']
- ft_chns = params['feature_chns']
- dropout = params['dropout']
- params1 = {'in_chns': in_chns,
- 'feature_chns': ft_chns,
- 'dropout': dropout,
- 'class_num': class_num,
- 'up_mode': 0 }
- params2 = {'in_chns': in_chns,
- 'feature_chns': ft_chns,
- 'dropout': dropout,
- 'class_num': class_num,
- 'up_mode': 1 }
- params3 = {'in_chns': in_chns,
- 'feature_chns': ft_chns,
- 'dropout': dropout,
- 'class_num': class_num,
- 'up_mode': 2 }
- self.encoder = Encoder(params1)
- self.decoder1 = Decoder(params1)
- self.decoder2 = Decoder(params2)
- self.decoder3 = Decoder(params3)
\ No newline at end of file
diff --git a/pymic/net/net2d/unet2d_pp.py b/pymic/net/net2d/unet2d_pp.py
deleted file mode 100644
index f2a003b..0000000
--- a/pymic/net/net2d/unet2d_pp.py
+++ /dev/null
@@ -1,109 +0,0 @@
-# -*- coding: utf-8 -*-
-import torch
-import torch.nn as nn
-from pymic.net.net2d.unet2d import *
-
-class UNet2Dpp(nn.Module):
- """
- An implementation of the U-Net++.
-
- * Reference: Zongwei Zhou, et al.: `UNet++: A Nested U-Net Architecture for Medical Image Segmentation.
- `_
- MICCAI DLMIA workshop, 2018: 3-11.
-
- Note that there are some modifications from the original paper, such as
- the use of dropout and leaky relu here.
-
- Parameters are given in the `params` dictionary, and should include the
- following fields:
-
- :param in_chns: (int) Input channel number.
- :param feature_chns: (list) Feature channel for each resolution level.
- The length should be 4 or 5, such as [16, 32, 64, 128, 256].
- :param dropout: (list) The dropout ratio for each resolution level.
- The length should be the same as that of `feature_chns`.
- :param class_num: (int) The class number for segmentation task.
- """
- def __init__(self, params):
- super(UNet2Dpp, self).__init__()
- self.params = params
- self.in_chns = self.params['in_chns']
- self.filters = self.params['feature_chns']
- self.dropout = self.params['dropout']
- self.n_class = self.params['class_num']
-
- self.pool = nn.MaxPool2d(kernel_size=2, stride=2)
- self.Up = nn.Upsample(scale_factor=2, mode='bilinear', align_corners=True)
-
- self.conv0_0 = ConvBlock(self.in_chns, self.filters[0], self.dropout[0])
- self.conv1_0 = ConvBlock(self.filters[0], self.filters[1], self.dropout[1])
- self.conv2_0 = ConvBlock(self.filters[1], self.filters[2], self.dropout[2])
- self.conv3_0 = ConvBlock(self.filters[2], self.filters[3], self.dropout[3])
- self.conv4_0 = ConvBlock(self.filters[3], self.filters[4], self.dropout[4])
-
- self.conv0_1 = ConvBlock(self.filters[0] + self.filters[1], self.filters[0], 0)
- self.conv1_1 = ConvBlock(self.filters[1] + self.filters[2], self.filters[1], 0)
- self.conv2_1 = ConvBlock(self.filters[2] + self.filters[3], self.filters[2], 0)
- self.conv3_1 = ConvBlock(self.filters[3] + self.filters[4], self.filters[3], 0)
-
- self.conv0_2 = ConvBlock(self.filters[0] * 2 + self.filters[1], self.filters[0], 0)
- self.conv1_2 = ConvBlock(self.filters[1] * 2 + self.filters[2], self.filters[1], 0)
- self.conv2_2 = ConvBlock(self.filters[2] * 2 + self.filters[3], self.filters[2], 0)
-
- self.conv0_3 = ConvBlock(self.filters[0] * 3 + self.filters[1], self.filters[0], 0)
- self.conv1_3 = ConvBlock(self.filters[1] * 3 + self.filters[2], self.filters[1], 0)
-
- self.conv0_4 = ConvBlock(self.filters[0] * 4 + self.filters[1], self.filters[0], 0)
-
- self.final = nn.Conv2d(self.filters[0], self.n_class, kernel_size=1)
-
- def forward(self, x):
- x_shape = list(x.shape)
- if(len(x_shape) == 5):
- [N, C, D, H, W] = x_shape
- new_shape = [N*D, C, H, W]
- x = torch.transpose(x, 1, 2)
- x = torch.reshape(x, new_shape)
- x0_0 = self.conv0_0(x)
- x1_0 = self.conv1_0(self.pool(x0_0))
- x0_1 = self.conv0_1(torch.cat([x0_0, self.Up(x1_0)], 1))
-
- x2_0 = self.conv2_0(self.pool(x1_0))
- x1_1 = self.conv1_1(torch.cat([x1_0, self.Up(x2_0)], 1))
- x0_2 = self.conv0_2(torch.cat([x0_0, x0_1, self.Up(x1_1)], 1))
-
- x3_0 = self.conv3_0(self.pool(x2_0))
- x2_1 = self.conv2_1(torch.cat([x2_0, self.Up(x3_0)], 1))
- x1_2 = self.conv1_2(torch.cat([x1_0, x1_1, self.Up(x2_1)], 1))
- x0_3 = self.conv0_3(torch.cat([x0_0, x0_1, x0_2, self.Up(x1_2)], 1))
-
- x4_0 = self.conv4_0(self.pool(x3_0))
- x3_1 = self.conv3_1(torch.cat([x3_0, self.Up(x4_0)], 1))
- x2_2 = self.conv2_2(torch.cat([x2_0, x2_1, self.Up(x3_1)], 1))
- x1_3 = self.conv1_3(torch.cat([x1_0, x1_1, x1_2, self.Up(x2_2)], 1))
- x0_4 = self.conv0_4(torch.cat([x0_0, x0_1, x0_2, x0_3, self.Up(x1_3)], 1))
-
- output = self.final(x0_4)
- if(len(x_shape) == 5):
- new_shape = [N, D] + list(output.shape)[1:]
- output = torch.reshape(output, new_shape)
- output = torch.transpose(output, 1, 2)
- return output
-
-
-if __name__ == "__main__":
- params = {'in_chns':4,
- 'feature_chns':[2, 8, 32, 48, 64],
- 'dropout': [0, 0, 0.3, 0.4, 0.5],
- 'class_num': 2}
- Net = UNet2Dpp(params)
- Net = Net.double()
-
- x = np.random.rand(4, 4, 10, 96, 96)
- xt = torch.from_numpy(x)
- xt = torch.tensor(xt)
-
- y = Net(xt)
- print(len(y.size()))
- y = y.detach().numpy()
- print(y.shape)
diff --git a/pymic/net/net2d/unet2d_scse.py b/pymic/net/net2d/unet2d_scse.py
deleted file mode 100644
index 54a5d2f..0000000
--- a/pymic/net/net2d/unet2d_scse.py
+++ /dev/null
@@ -1,114 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-
-import torch
-import torch.nn as nn
-import numpy as np
-from pymic.net.net2d.unet2d import UpBlock, Encoder, Decoder, UNet2D
-from pymic.net.net2d.scse2d import *
-
-class ConvScSEBlock(nn.Module):
- """
- Two convolutional blocks followed by `ChannelSpatialSELayer`.
- Each block consists of `Conv2d` + `BatchNorm2d` + `LeakyReLU`.
- A dropout layer is used between the wo blocks.
-
- :param in_channels: (int) Input channel number.
- :param out_channels: (int) Output channel number.
- :param dropout_p: (int) Dropout probability.
- """
- def __init__(self, in_channels, out_channels, dropout_p):
- super(ConvScSEBlock, self).__init__()
- self.conv_conv = nn.Sequential(
- nn.Conv2d(in_channels, out_channels, kernel_size=3, padding=1),
- nn.BatchNorm2d(out_channels),
- nn.LeakyReLU(),
- nn.Dropout(dropout_p),
- nn.Conv2d(out_channels, out_channels, kernel_size=3, padding=1),
- nn.BatchNorm2d(out_channels),
- nn.LeakyReLU(),
- ChannelSpatialSELayer(out_channels)
- )
-
- def forward(self, x):
- return self.conv_conv(x)
-
-class DownBlock(nn.Module):
- """Downsampling followed by `ConvScSEBlock`.
-
- :param in_channels: (int) Input channel number.
- :param out_channels: (int) Output channel number.
- :param dropout_p: (int) Dropout probability.
- """
- def __init__(self, in_channels, out_channels, dropout_p):
- super(DownBlock, self).__init__()
- self.maxpool_conv = nn.Sequential(
- nn.MaxPool2d(2),
- ConvScSEBlock(in_channels, out_channels, dropout_p)
-
- )
-
- def forward(self, x):
- return self.maxpool_conv(x)
-
-class UpBlockScSE(UpBlock):
- """Up-sampling followed by `ConvScSEBlock` in U-Net structure.
-
- The parameters for the backbone should be given in the `params` dictionary.
- See :mod:`pymic.net.net2d.unet2d.UpBlock` for details.
- """
- def __init__(self, in_channels1, in_channels2, out_channels, dropout_p, up_mode = 2):
- super(UpBlockScSE, self).__init__(in_channels1, in_channels2, out_channels, dropout_p, up_mode)
- self.conv = ConvScSEBlock(in_channels2 * 2, out_channels, dropout_p)
-
-class EncoderScSE(Encoder):
- """
- Encoder of 2D UNet with ScSE.
-
- The parameters for the backbone should be given in the `params` dictionary.
- See :mod:`pymic.net.net2d.unet2d.Encoder` for details.
- """
- def __init__(self, params):
- super(EncoderScSE, self).__init__(params)
-
- self.in_conv= ConvScSEBlock(self.in_chns, self.ft_chns[0], self.dropout[0])
- self.down1 = DownBlock(self.ft_chns[0], self.ft_chns[1], self.dropout[1])
- self.down2 = DownBlock(self.ft_chns[1], self.ft_chns[2], self.dropout[2])
- self.down3 = DownBlock(self.ft_chns[2], self.ft_chns[3], self.dropout[3])
- if(len(self.ft_chns) == 5):
- self.down4 = DownBlock(self.ft_chns[3], self.ft_chns[4], self.dropout[4])
-
-class DecoderScSE(Decoder):
- """
- Decoder of 2D UNet with ScSE.
-
- The parameters for the backbone should be given in the `params` dictionary.
- See :mod:`pymic.net.net2d.unet2d.Decoder` for details.
- """
- def __init__(self, params):
- super(DecoderScSE, self).__init__(params)
-
-
- if(len(self.ft_chns) == 5):
- self.up1 = UpBlockScSE(self.ft_chns[4], self.ft_chns[3], self.ft_chns[3], self.dropout[3], self.up_mode)
- self.up2 = UpBlockScSE(self.ft_chns[3], self.ft_chns[2], self.ft_chns[2], self.dropout[2], self.up_mode)
- self.up3 = UpBlockScSE(self.ft_chns[2], self.ft_chns[1], self.ft_chns[1], self.dropout[1], self.up_mode)
- self.up4 = UpBlockScSE(self.ft_chns[1], self.ft_chns[0], self.ft_chns[0], self.dropout[0], self.up_mode)
-
-
-class UNet2D_ScSE(UNet2D):
- """
- Combining 2D U-Net with SCSE module.
-
- * Reference: Abhijit Guha Roy, Nassir Navab, Christian Wachinger:
- Recalibrating Fully Convolutional Networks With Spatial and Channel
- "Squeeze and Excitation" Blocks.
- `IEEE Trans. Med. Imaging 38(2): 540-549 (2019). `_
-
- The parameters for the backbone should be given in the `params` dictionary.
- See :mod:`pymic.net.net2d.unet2d.unet2d` for details.
- """
- def __init__(self, params):
- super(UNet2D_ScSE, self).__init__(params)
- self.encoder = Encoder(params)
- self.decoder = Decoder(params)
diff --git a/pymic/net/net2d/unet2d_vm.py b/pymic/net/net2d/unet2d_vm.py
deleted file mode 100644
index 126fa30..0000000
--- a/pymic/net/net2d/unet2d_vm.py
+++ /dev/null
@@ -1,820 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-import math
-from functools import partial
-from typing import Optional, Callable
-
-import torch
-import torch.nn as nn
-import torch.nn.functional as F
-import torch.utils.checkpoint as checkpoint
-from einops import rearrange, repeat
-from timm.models.layers import DropPath, to_2tuple, trunc_normal_
-try:
- from mamba_ssm.ops.selective_scan_interface import selective_scan_fn, selective_scan_ref
-except:
- pass
-
-# an alternative for mamba_ssm (in which causal_conv1d is needed)
-try:
- from selective_scan import selective_scan_fn as selective_scan_fn_v1
- from selective_scan import selective_scan_ref as selective_scan_ref_v1
-except:
- pass
-
-DropPath.__repr__ = lambda self: f"timm.DropPath({self.drop_prob})"
-
-
-def flops_selective_scan_ref(B=1, L=256, D=768, N=16, with_D=True, with_Z=False, with_Group=True, with_complex=False):
- """
- u: r(B D L)
- delta: r(B D L)
- A: r(D N)
- B: r(B N L)
- C: r(B N L)
- D: r(D)
- z: r(B D L)
- delta_bias: r(D), fp32
-
- ignores:
- [.float(), +, .softplus, .shape, new_zeros, repeat, stack, to(dtype), silu]
- """
- import numpy as np
-
- # fvcore.nn.jit_handles
- def get_flops_einsum(input_shapes, equation):
- np_arrs = [np.zeros(s) for s in input_shapes]
- optim = np.einsum_path(equation, *np_arrs, optimize="optimal")[1]
- for line in optim.split("\n"):
- if "optimized flop" in line.lower():
- # divided by 2 because we count MAC (multiply-add counted as one flop)
- flop = float(np.floor(float(line.split(":")[-1]) / 2))
- return flop
-
-
- assert not with_complex
-
- flops = 0 # below code flops = 0
- if False:
- ...
- """
- dtype_in = u.dtype
- u = u.float()
- delta = delta.float()
- if delta_bias is not None:
- delta = delta + delta_bias[..., None].float()
- if delta_softplus:
- delta = F.softplus(delta)
- batch, dim, dstate = u.shape[0], A.shape[0], A.shape[1]
- is_variable_B = B.dim() >= 3
- is_variable_C = C.dim() >= 3
- if A.is_complex():
- if is_variable_B:
- B = torch.view_as_complex(rearrange(B.float(), "... (L two) -> ... L two", two=2))
- if is_variable_C:
- C = torch.view_as_complex(rearrange(C.float(), "... (L two) -> ... L two", two=2))
- else:
- B = B.float()
- C = C.float()
- x = A.new_zeros((batch, dim, dstate))
- ys = []
- """
-
- flops += get_flops_einsum([[B, D, L], [D, N]], "bdl,dn->bdln")
- if with_Group:
- flops += get_flops_einsum([[B, D, L], [B, N, L], [B, D, L]], "bdl,bnl,bdl->bdln")
- else:
- flops += get_flops_einsum([[B, D, L], [B, D, N, L], [B, D, L]], "bdl,bdnl,bdl->bdln")
- if False:
- ...
- """
- deltaA = torch.exp(torch.einsum('bdl,dn->bdln', delta, A))
- if not is_variable_B:
- deltaB_u = torch.einsum('bdl,dn,bdl->bdln', delta, B, u)
- else:
- if B.dim() == 3:
- deltaB_u = torch.einsum('bdl,bnl,bdl->bdln', delta, B, u)
- else:
- B = repeat(B, "B G N L -> B (G H) N L", H=dim // B.shape[1])
- deltaB_u = torch.einsum('bdl,bdnl,bdl->bdln', delta, B, u)
- if is_variable_C and C.dim() == 4:
- C = repeat(C, "B G N L -> B (G H) N L", H=dim // C.shape[1])
- last_state = None
- """
-
- in_for_flops = B * D * N
- if with_Group:
- in_for_flops += get_flops_einsum([[B, D, N], [B, D, N]], "bdn,bdn->bd")
- else:
- in_for_flops += get_flops_einsum([[B, D, N], [B, N]], "bdn,bn->bd")
- flops += L * in_for_flops
- if False:
- ...
- """
- for i in range(u.shape[2]):
- x = deltaA[:, :, i] * x + deltaB_u[:, :, i]
- if not is_variable_C:
- y = torch.einsum('bdn,dn->bd', x, C)
- else:
- if C.dim() == 3:
- y = torch.einsum('bdn,bn->bd', x, C[:, :, i])
- else:
- y = torch.einsum('bdn,bdn->bd', x, C[:, :, :, i])
- if i == u.shape[2] - 1:
- last_state = x
- if y.is_complex():
- y = y.real * 2
- ys.append(y)
- y = torch.stack(ys, dim=2) # (batch dim L)
- """
-
- if with_D:
- flops += B * D * L
- if with_Z:
- flops += B * D * L
- if False:
- ...
- """
- out = y if D is None else y + u * rearrange(D, "d -> d 1")
- if z is not None:
- out = out * F.silu(z)
- out = out.to(dtype=dtype_in)
- """
-
- return flops
-
-
-class PatchEmbed2D(nn.Module):
- r""" Image to Patch Embedding
- Args:
- patch_size (int): Patch token size. Default: 4.
- in_chans (int): Number of input image channels. Default: 3.
- embed_dim (int): Number of linear projection output channels. Default: 96.
- norm_layer (nn.Module, optional): Normalization layer. Default: None
- """
- def __init__(self, patch_size=4, in_chans=3, embed_dim=96, norm_layer=None, **kwargs):
- super().__init__()
- if isinstance(patch_size, int):
- patch_size = (patch_size, patch_size)
- self.proj = nn.Conv2d(in_chans, embed_dim, kernel_size=patch_size, stride=patch_size)
- if norm_layer is not None:
- self.norm = norm_layer(embed_dim)
- else:
- self.norm = None
-
- def forward(self, x):
- x = self.proj(x).permute(0, 2, 3, 1)
- if self.norm is not None:
- x = self.norm(x)
- return x
-
-
-class PatchMerging2D(nn.Module):
- r""" Patch Merging Layer.
- Args:
- input_resolution (tuple[int]): Resolution of input feature.
- dim (int): Number of input channels.
- norm_layer (nn.Module, optional): Normalization layer. Default: nn.LayerNorm
- """
-
- def __init__(self, dim, norm_layer=nn.LayerNorm):
- super().__init__()
- self.dim = dim
- self.reduction = nn.Linear(4 * dim, 2 * dim, bias=False)
- self.norm = norm_layer(4 * dim)
-
- def forward(self, x):
- B, H, W, C = x.shape
-
- SHAPE_FIX = [-1, -1]
- if (W % 2 != 0) or (H % 2 != 0):
- print(f"Warning, x.shape {x.shape} is not match even ===========", flush=True)
- SHAPE_FIX[0] = H // 2
- SHAPE_FIX[1] = W // 2
-
- x0 = x[:, 0::2, 0::2, :] # B H/2 W/2 C
- x1 = x[:, 1::2, 0::2, :] # B H/2 W/2 C
- x2 = x[:, 0::2, 1::2, :] # B H/2 W/2 C
- x3 = x[:, 1::2, 1::2, :] # B H/2 W/2 C
-
- if SHAPE_FIX[0] > 0:
- x0 = x0[:, :SHAPE_FIX[0], :SHAPE_FIX[1], :]
- x1 = x1[:, :SHAPE_FIX[0], :SHAPE_FIX[1], :]
- x2 = x2[:, :SHAPE_FIX[0], :SHAPE_FIX[1], :]
- x3 = x3[:, :SHAPE_FIX[0], :SHAPE_FIX[1], :]
-
- x = torch.cat([x0, x1, x2, x3], -1) # B H/2 W/2 4*C
- x = x.view(B, H//2, W//2, 4 * C) # B H/2*W/2 4*C
-
- x = self.norm(x)
- x = self.reduction(x)
-
- return x
-
-
-class PatchExpand2D(nn.Module):
- def __init__(self, dim, dim_scale=2, norm_layer=nn.LayerNorm):
- super().__init__()
- self.dim = dim*2
- self.dim_scale = dim_scale
- self.expand = nn.Linear(self.dim, dim_scale*self.dim, bias=False)
- self.norm = norm_layer(self.dim // dim_scale)
-
- def forward(self, x):
- B, H, W, C = x.shape
- x = self.expand(x)
-
- x = rearrange(x, 'b h w (p1 p2 c)-> b (h p1) (w p2) c', p1=self.dim_scale, p2=self.dim_scale, c=C//self.dim_scale)
- x= self.norm(x)
-
- return x
-
-
-class Final_PatchExpand2D(nn.Module):
- def __init__(self, dim, dim_scale=4, norm_layer=nn.LayerNorm):
- super().__init__()
- self.dim = dim
- self.dim_scale = dim_scale
- self.expand = nn.Linear(self.dim, dim_scale*self.dim, bias=False)
- self.norm = norm_layer(self.dim // dim_scale)
-
- def forward(self, x):
- B, H, W, C = x.shape
- x = self.expand(x)
-
- x = rearrange(x, 'b h w (p1 p2 c)-> b (h p1) (w p2) c', p1=self.dim_scale, p2=self.dim_scale, c=C//self.dim_scale)
- x= self.norm(x)
-
- return x
-
-
-class SS2D(nn.Module):
- def __init__(
- self,
- d_model,
- d_state=16,
- # d_state="auto", # 20240109
- d_conv=3,
- expand=2,
- dt_rank="auto",
- dt_min=0.001,
- dt_max=0.1,
- dt_init="random",
- dt_scale=1.0,
- dt_init_floor=1e-4,
- dropout=0.,
- conv_bias=True,
- bias=False,
- device=None,
- dtype=None,
- **kwargs,
- ):
- factory_kwargs = {"device": device, "dtype": dtype}
- super().__init__()
- self.d_model = d_model
- self.d_state = d_state
- # self.d_state = math.ceil(self.d_model / 6) if d_state == "auto" else d_model # 20240109
- self.d_conv = d_conv
- self.expand = expand
- self.d_inner = int(self.expand * self.d_model)
- self.dt_rank = math.ceil(self.d_model / 16) if dt_rank == "auto" else dt_rank
-
- self.in_proj = nn.Linear(self.d_model, self.d_inner * 2, bias=bias, **factory_kwargs)
- self.conv2d = nn.Conv2d(
- in_channels=self.d_inner,
- out_channels=self.d_inner,
- groups=self.d_inner,
- bias=conv_bias,
- kernel_size=d_conv,
- padding=(d_conv - 1) // 2,
- **factory_kwargs,
- )
- self.act = nn.SiLU()
-
- self.x_proj = (
- nn.Linear(self.d_inner, (self.dt_rank + self.d_state * 2), bias=False, **factory_kwargs),
- nn.Linear(self.d_inner, (self.dt_rank + self.d_state * 2), bias=False, **factory_kwargs),
- nn.Linear(self.d_inner, (self.dt_rank + self.d_state * 2), bias=False, **factory_kwargs),
- nn.Linear(self.d_inner, (self.dt_rank + self.d_state * 2), bias=False, **factory_kwargs),
- )
- self.x_proj_weight = nn.Parameter(torch.stack([t.weight for t in self.x_proj], dim=0)) # (K=4, N, inner)
- del self.x_proj
-
- self.dt_projs = (
- self.dt_init(self.dt_rank, self.d_inner, dt_scale, dt_init, dt_min, dt_max, dt_init_floor, **factory_kwargs),
- self.dt_init(self.dt_rank, self.d_inner, dt_scale, dt_init, dt_min, dt_max, dt_init_floor, **factory_kwargs),
- self.dt_init(self.dt_rank, self.d_inner, dt_scale, dt_init, dt_min, dt_max, dt_init_floor, **factory_kwargs),
- self.dt_init(self.dt_rank, self.d_inner, dt_scale, dt_init, dt_min, dt_max, dt_init_floor, **factory_kwargs),
- )
- self.dt_projs_weight = nn.Parameter(torch.stack([t.weight for t in self.dt_projs], dim=0)) # (K=4, inner, rank)
- self.dt_projs_bias = nn.Parameter(torch.stack([t.bias for t in self.dt_projs], dim=0)) # (K=4, inner)
- del self.dt_projs
-
- self.A_logs = self.A_log_init(self.d_state, self.d_inner, copies=4, merge=True) # (K=4, D, N)
- self.Ds = self.D_init(self.d_inner, copies=4, merge=True) # (K=4, D, N)
-
- # self.selective_scan = selective_scan_fn
- self.forward_core = self.forward_corev0
-
- self.out_norm = nn.LayerNorm(self.d_inner)
- self.out_proj = nn.Linear(self.d_inner, self.d_model, bias=bias, **factory_kwargs)
- self.dropout = nn.Dropout(dropout) if dropout > 0. else None
-
- @staticmethod
- def dt_init(dt_rank, d_inner, dt_scale=1.0, dt_init="random", dt_min=0.001, dt_max=0.1, dt_init_floor=1e-4, **factory_kwargs):
- dt_proj = nn.Linear(dt_rank, d_inner, bias=True, **factory_kwargs)
-
- # Initialize special dt projection to preserve variance at initialization
- dt_init_std = dt_rank**-0.5 * dt_scale
- if dt_init == "constant":
- nn.init.constant_(dt_proj.weight, dt_init_std)
- elif dt_init == "random":
- nn.init.uniform_(dt_proj.weight, -dt_init_std, dt_init_std)
- else:
- raise NotImplementedError
-
- # Initialize dt bias so that F.softplus(dt_bias) is between dt_min and dt_max
- dt = torch.exp(
- torch.rand(d_inner, **factory_kwargs) * (math.log(dt_max) - math.log(dt_min))
- + math.log(dt_min)
- ).clamp(min=dt_init_floor)
- # Inverse of softplus: https://github.com/pytorch/pytorch/issues/72759
- inv_dt = dt + torch.log(-torch.expm1(-dt))
- with torch.no_grad():
- dt_proj.bias.copy_(inv_dt)
- # Our initialization would set all Linear.bias to zero, need to mark this one as _no_reinit
- dt_proj.bias._no_reinit = True
-
- return dt_proj
-
- @staticmethod
- def A_log_init(d_state, d_inner, copies=1, device=None, merge=True):
- # S4D real initialization
- A = repeat(
- torch.arange(1, d_state + 1, dtype=torch.float32, device=device),
- "n -> d n",
- d=d_inner,
- ).contiguous()
- A_log = torch.log(A) # Keep A_log in fp32
- if copies > 1:
- A_log = repeat(A_log, "d n -> r d n", r=copies)
- if merge:
- A_log = A_log.flatten(0, 1)
- A_log = nn.Parameter(A_log)
- A_log._no_weight_decay = True
- return A_log
-
- @staticmethod
- def D_init(d_inner, copies=1, device=None, merge=True):
- # D "skip" parameter
- D = torch.ones(d_inner, device=device)
- if copies > 1:
- D = repeat(D, "n1 -> r n1", r=copies)
- if merge:
- D = D.flatten(0, 1)
- D = nn.Parameter(D) # Keep in fp32
- D._no_weight_decay = True
- return D
-
- def forward_corev0(self, x: torch.Tensor):
- self.selective_scan = selective_scan_fn
-
- B, C, H, W = x.shape
- L = H * W
- K = 4
-
- x_hwwh = torch.stack([x.view(B, -1, L), torch.transpose(x, dim0=2, dim1=3).contiguous().view(B, -1, L)], dim=1).view(B, 2, -1, L)
- xs = torch.cat([x_hwwh, torch.flip(x_hwwh, dims=[-1])], dim=1) # (b, k, d, l)
-
- x_dbl = torch.einsum("b k d l, k c d -> b k c l", xs.view(B, K, -1, L), self.x_proj_weight)
- # x_dbl = x_dbl + self.x_proj_bias.view(1, K, -1, 1)
- dts, Bs, Cs = torch.split(x_dbl, [self.dt_rank, self.d_state, self.d_state], dim=2)
- dts = torch.einsum("b k r l, k d r -> b k d l", dts.view(B, K, -1, L), self.dt_projs_weight)
- # dts = dts + self.dt_projs_bias.view(1, K, -1, 1)
-
- xs = xs.float().view(B, -1, L) # (b, k * d, l)
- dts = dts.contiguous().float().view(B, -1, L) # (b, k * d, l)
- Bs = Bs.float().view(B, K, -1, L) # (b, k, d_state, l)
- Cs = Cs.float().view(B, K, -1, L) # (b, k, d_state, l)
- Ds = self.Ds.float().view(-1) # (k * d)
- As = -torch.exp(self.A_logs.float()).view(-1, self.d_state) # (k * d, d_state)
- dt_projs_bias = self.dt_projs_bias.float().view(-1) # (k * d)
-
- out_y = self.selective_scan(
- xs, dts,
- As, Bs, Cs, Ds, z=None,
- delta_bias=dt_projs_bias,
- delta_softplus=True,
- return_last_state=False,
- ).view(B, K, -1, L)
- assert out_y.dtype == torch.float
-
- inv_y = torch.flip(out_y[:, 2:4], dims=[-1]).view(B, 2, -1, L)
- wh_y = torch.transpose(out_y[:, 1].view(B, -1, W, H), dim0=2, dim1=3).contiguous().view(B, -1, L)
- invwh_y = torch.transpose(inv_y[:, 1].view(B, -1, W, H), dim0=2, dim1=3).contiguous().view(B, -1, L)
-
- return out_y[:, 0], inv_y[:, 0], wh_y, invwh_y
-
- # an alternative to forward_corev1
- def forward_corev1(self, x: torch.Tensor):
- self.selective_scan = selective_scan_fn_v1
-
- B, C, H, W = x.shape
- L = H * W
- K = 4
-
- x_hwwh = torch.stack([x.view(B, -1, L), torch.transpose(x, dim0=2, dim1=3).contiguous().view(B, -1, L)], dim=1).view(B, 2, -1, L)
- xs = torch.cat([x_hwwh, torch.flip(x_hwwh, dims=[-1])], dim=1) # (b, k, d, l)
-
- x_dbl = torch.einsum("b k d l, k c d -> b k c l", xs.view(B, K, -1, L), self.x_proj_weight)
- # x_dbl = x_dbl + self.x_proj_bias.view(1, K, -1, 1)
- dts, Bs, Cs = torch.split(x_dbl, [self.dt_rank, self.d_state, self.d_state], dim=2)
- dts = torch.einsum("b k r l, k d r -> b k d l", dts.view(B, K, -1, L), self.dt_projs_weight)
- # dts = dts + self.dt_projs_bias.view(1, K, -1, 1)
-
- xs = xs.float().view(B, -1, L) # (b, k * d, l)
- dts = dts.contiguous().float().view(B, -1, L) # (b, k * d, l)
- Bs = Bs.float().view(B, K, -1, L) # (b, k, d_state, l)
- Cs = Cs.float().view(B, K, -1, L) # (b, k, d_state, l)
- Ds = self.Ds.float().view(-1) # (k * d)
- As = -torch.exp(self.A_logs.float()).view(-1, self.d_state) # (k * d, d_state)
- dt_projs_bias = self.dt_projs_bias.float().view(-1) # (k * d)
-
- out_y = self.selective_scan(
- xs, dts,
- As, Bs, Cs, Ds,
- delta_bias=dt_projs_bias,
- delta_softplus=True,
- ).view(B, K, -1, L)
- assert out_y.dtype == torch.float
-
- inv_y = torch.flip(out_y[:, 2:4], dims=[-1]).view(B, 2, -1, L)
- wh_y = torch.transpose(out_y[:, 1].view(B, -1, W, H), dim0=2, dim1=3).contiguous().view(B, -1, L)
- invwh_y = torch.transpose(inv_y[:, 1].view(B, -1, W, H), dim0=2, dim1=3).contiguous().view(B, -1, L)
-
- return out_y[:, 0], inv_y[:, 0], wh_y, invwh_y
-
- def forward(self, x: torch.Tensor, **kwargs):
- B, H, W, C = x.shape
-
- xz = self.in_proj(x)
- x, z = xz.chunk(2, dim=-1) # (b, h, w, d)
-
- x = x.permute(0, 3, 1, 2).contiguous()
- x = self.act(self.conv2d(x)) # (b, d, h, w)
- y1, y2, y3, y4 = self.forward_core(x)
- assert y1.dtype == torch.float32
- y = y1 + y2 + y3 + y4
- y = torch.transpose(y, dim0=1, dim1=2).contiguous().view(B, H, W, -1)
- y = self.out_norm(y)
- y = y * F.silu(z)
- out = self.out_proj(y)
- if self.dropout is not None:
- out = self.dropout(out)
- return out
-
-
-class VSSBlock(nn.Module):
- def __init__(
- self,
- hidden_dim: int = 0,
- drop_path: float = 0,
- norm_layer: Callable[..., torch.nn.Module] = partial(nn.LayerNorm, eps=1e-6),
- attn_drop_rate: float = 0,
- d_state: int = 16,
- **kwargs,
- ):
- super().__init__()
- self.ln_1 = norm_layer(hidden_dim)
- self.self_attention = SS2D(d_model=hidden_dim, dropout=attn_drop_rate, d_state=d_state, **kwargs)
- self.drop_path = DropPath(drop_path)
-
- def forward(self, input: torch.Tensor):
- x = input + self.drop_path(self.self_attention(self.ln_1(input)))
- return x
-
-
-class VSSLayer(nn.Module):
- """ A basic Swin Transformer layer for one stage.
- Args:
- dim (int): Number of input channels.
- depth (int): Number of blocks.
- drop (float, optional): Dropout rate. Default: 0.0
- attn_drop (float, optional): Attention dropout rate. Default: 0.0
- drop_path (float | tuple[float], optional): Stochastic depth rate. Default: 0.0
- norm_layer (nn.Module, optional): Normalization layer. Default: nn.LayerNorm
- downsample (nn.Module | None, optional): Downsample layer at the end of the layer. Default: None
- use_checkpoint (bool): Whether to use checkpointing to save memory. Default: False.
- """
-
- def __init__(
- self,
- dim,
- depth,
- attn_drop=0.,
- drop_path=0.,
- norm_layer=nn.LayerNorm,
- downsample=None,
- use_checkpoint=False,
- d_state=16,
- **kwargs,
- ):
- super().__init__()
- self.dim = dim
- self.use_checkpoint = use_checkpoint
-
- self.blocks = nn.ModuleList([
- VSSBlock(
- hidden_dim=dim,
- drop_path=drop_path[i] if isinstance(drop_path, list) else drop_path,
- norm_layer=norm_layer,
- attn_drop_rate=attn_drop,
- d_state=d_state,
- )
- for i in range(depth)])
-
- if True: # is this really applied? Yes, but been overriden later in VSSM!
- def _init_weights(module: nn.Module):
- for name, p in module.named_parameters():
- if name in ["out_proj.weight"]:
- p = p.clone().detach_() # fake init, just to keep the seed ....
- nn.init.kaiming_uniform_(p, a=math.sqrt(5))
- self.apply(_init_weights)
-
- if downsample is not None:
- self.downsample = downsample(dim=dim, norm_layer=norm_layer)
- else:
- self.downsample = None
-
-
- def forward(self, x):
- for blk in self.blocks:
- if self.use_checkpoint:
- x = checkpoint.checkpoint(blk, x)
- else:
- x = blk(x)
-
- if self.downsample is not None:
- x = self.downsample(x)
-
- return x
-
-
-
-class VSSLayer_up(nn.Module):
- """ A basic Swin Transformer layer for one stage.
- Args:
- dim (int): Number of input channels.
- depth (int): Number of blocks.
- drop (float, optional): Dropout rate. Default: 0.0
- attn_drop (float, optional): Attention dropout rate. Default: 0.0
- drop_path (float | tuple[float], optional): Stochastic depth rate. Default: 0.0
- norm_layer (nn.Module, optional): Normalization layer. Default: nn.LayerNorm
- downsample (nn.Module | None, optional): Downsample layer at the end of the layer. Default: None
- use_checkpoint (bool): Whether to use checkpointing to save memory. Default: False.
- """
-
- def __init__(
- self,
- dim,
- depth,
- attn_drop=0.,
- drop_path=0.,
- norm_layer=nn.LayerNorm,
- upsample=None,
- use_checkpoint=False,
- d_state=16,
- **kwargs,
- ):
- super().__init__()
- self.dim = dim
- self.use_checkpoint = use_checkpoint
-
- self.blocks = nn.ModuleList([
- VSSBlock(
- hidden_dim=dim,
- drop_path=drop_path[i] if isinstance(drop_path, list) else drop_path,
- norm_layer=norm_layer,
- attn_drop_rate=attn_drop,
- d_state=d_state,
- )
- for i in range(depth)])
-
- if True: # is this really applied? Yes, but been overriden later in VSSM!
- def _init_weights(module: nn.Module):
- for name, p in module.named_parameters():
- if name in ["out_proj.weight"]:
- p = p.clone().detach_() # fake init, just to keep the seed ....
- nn.init.kaiming_uniform_(p, a=math.sqrt(5))
- self.apply(_init_weights)
-
- if upsample is not None:
- self.upsample = upsample(dim=dim, norm_layer=norm_layer)
- else:
- self.upsample = None
-
-
- def forward(self, x):
- if self.upsample is not None:
- x = self.upsample(x)
- for blk in self.blocks:
- if self.use_checkpoint:
- x = checkpoint.checkpoint(blk, x)
- else:
- x = blk(x)
- return x
-
-
-
-# class VSSM(nn.Module):
-class VMUNet(nn.Module):
- """
- VM_UNet that is a UNet-like pure vision mambal network for segmentation.
-
- * Reference: Jiacheng Ruan et al., VM-UNet: Vision Mamba UNet for Medical Image Segmentation.
- arxiv 2403.09157, 2024.
-
- The implementation is based on the code at:
- https://github.com/JCruan519/VM-UNet.
-
- The parameters for the backbone should be given in the `params` dictionary.
-
- :param in_chns: (int) Input channel number.
- :param class_num: (int) The class number for segmentation task.
- :param depths: (list) The depth of VSS block at each resolution level.
- The length should be 4, by default it is [2, 2, 9, 2].
- :param feature_chns: (list) Feature channel for each resolution level.
- The length should be 4, by default it is [96, 192, 384, 768].
- """
- # def __init__(self, c=4, in_chans=3, num_classes=1000, depths=[2, 2, 9, 2], depths_decoder=[2, 9, 2, 2],
- # dims=[96, 192, 384, 768], dims_decoder=[768, 384, 192, 96], d_state=16, drop_rate=0., attn_drop_rate=0., drop_path_rate=0.1,
- # norm_layer=nn.LayerNorm, patch_norm=True,
- # use_checkpoint=False, **kwargs):
- # super().__init__()
- def __init__(self, params):
- super(VMUNet, self).__init__()
- in_chans = params['in_chns']
- num_classes = params['class_num']
- patch_size = params.get('patch_size', 4)
- depths = params.get('depths', [2, 2, 9, 2])
- depths_decoder = depths.copy()
- depths_decoder.reverse()
- dims = params.get('feature_chns', [96, 192, 384, 768])
- dims_decoder = dims.copy()
- dims_decoder.reverse()
- d_state = params.get('d_state', 16)
- drop_rate = params.get('drop_rate', 0.)
- attn_drop_rate = params.get('att_drop_rate', 0.)
- drop_path_rate = params.get('path_drop_rate', 0.1)
-
- norm_layer = nn.LayerNorm
- patch_norm = True
- use_checkpoint = False
-
- self.num_classes = num_classes
- self.num_layers = len(depths)
- if isinstance(dims, int):
- dims = [int(dims * 2 ** i_layer) for i_layer in range(self.num_layers)]
- self.embed_dim = dims[0]
- self.num_features = dims[-1]
- self.dims = dims
-
- self.patch_embed = PatchEmbed2D(patch_size=patch_size, in_chans=in_chans, embed_dim=self.embed_dim,
- norm_layer=norm_layer if patch_norm else None)
-
- # WASTED absolute position embedding ======================
- self.ape = False
- # self.ape = False
- # drop_rate = 0.0
- if self.ape:
- self.patches_resolution = self.patch_embed.patches_resolution
- self.absolute_pos_embed = nn.Parameter(torch.zeros(1, *self.patches_resolution, self.embed_dim))
- trunc_normal_(self.absolute_pos_embed, std=.02)
- self.pos_drop = nn.Dropout(p=drop_rate)
-
- dpr = [x.item() for x in torch.linspace(0, drop_path_rate, sum(depths))] # stochastic depth decay rule
- dpr_decoder = [x.item() for x in torch.linspace(0, drop_path_rate, sum(depths_decoder))][::-1]
-
- self.layers = nn.ModuleList()
- for i_layer in range(self.num_layers):
- layer = VSSLayer(
- dim=dims[i_layer],
- depth=depths[i_layer],
- d_state=math.ceil(dims[0] / 6) if d_state is None else d_state, # 20240109
- drop=drop_rate,
- attn_drop=attn_drop_rate,
- drop_path=dpr[sum(depths[:i_layer]):sum(depths[:i_layer + 1])],
- norm_layer=norm_layer,
- downsample=PatchMerging2D if (i_layer < self.num_layers - 1) else None,
- use_checkpoint=use_checkpoint,
- )
- self.layers.append(layer)
-
- self.layers_up = nn.ModuleList()
- for i_layer in range(self.num_layers):
- layer = VSSLayer_up(
- dim=dims_decoder[i_layer],
- depth=depths_decoder[i_layer],
- d_state=math.ceil(dims[0] / 6) if d_state is None else d_state, # 20240109
- drop=drop_rate,
- attn_drop=attn_drop_rate,
- drop_path=dpr_decoder[sum(depths_decoder[:i_layer]):sum(depths_decoder[:i_layer + 1])],
- norm_layer=norm_layer,
- upsample=PatchExpand2D if (i_layer != 0) else None,
- use_checkpoint=use_checkpoint,
- )
- self.layers_up.append(layer)
-
- self.final_up = Final_PatchExpand2D(dim=dims_decoder[-1], dim_scale=4, norm_layer=norm_layer)
- self.final_conv = nn.Conv2d(dims_decoder[-1]//4, num_classes, 1)
-
- # self.norm = norm_layer(self.num_features)
- # self.avgpool = nn.AdaptiveAvgPool1d(1)
- # self.head = nn.Linear(self.num_features, num_classes) if num_classes > 0 else nn.Identity()
-
- self.apply(self._init_weights)
-
- def _init_weights(self, m: nn.Module):
- """
- out_proj.weight which is previously initilized in VSSBlock, would be cleared in nn.Linear
- no fc.weight found in the any of the model parameters
- no nn.Embedding found in the any of the model parameters
- so the thing is, VSSBlock initialization is useless
-
- Conv2D is not intialized !!!
- """
- if isinstance(m, nn.Linear):
- trunc_normal_(m.weight, std=.02)
- if isinstance(m, nn.Linear) and m.bias is not None:
- nn.init.constant_(m.bias, 0)
- elif isinstance(m, nn.LayerNorm):
- nn.init.constant_(m.bias, 0)
- nn.init.constant_(m.weight, 1.0)
-
- @torch.jit.ignore
- def no_weight_decay(self):
- return {'absolute_pos_embed'}
-
- @torch.jit.ignore
- def no_weight_decay_keywords(self):
- return {'relative_position_bias_table'}
-
- def forward_features(self, x):
- skip_list = []
- x = self.patch_embed(x)
- if self.ape:
- x = x + self.absolute_pos_embed
- x = self.pos_drop(x)
-
- for layer in self.layers:
- skip_list.append(x)
- x = layer(x)
- return x, skip_list
-
- def forward_features_up(self, x, skip_list):
- for inx, layer_up in enumerate(self.layers_up):
- if inx == 0:
- x = layer_up(x)
- else:
- x = layer_up(x+skip_list[-inx])
-
- return x
-
- def forward_final(self, x):
- x = self.final_up(x)
- x = x.permute(0,3,1,2)
- x = self.final_conv(x)
- return x
-
- def forward_backbone(self, x):
- x = self.patch_embed(x)
- if self.ape:
- x = x + self.absolute_pos_embed
- x = self.pos_drop(x)
-
- for layer in self.layers:
- x = layer(x)
- return x
-
- def forward(self, x):
- x_shape = list(x.shape)
- if(len(x_shape) == 5):
- [N, C, D, H, W] = x_shape
- new_shape = [N*D, C, H, W]
- x = torch.transpose(x, 1, 2)
- x = torch.reshape(x, new_shape)
- x, skip_list = self.forward_features(x)
- x = self.forward_features_up(x, skip_list)
- x = self.forward_final(x)
-
- if(len(x_shape) == 5):
- new_shape = [N, D] + list(x.shape)[1:]
- x = torch.transpose(torch.reshape(x, new_shape), 1, 2)
-
- return x
-
-
-
-
-
-
diff --git a/pymic/net/net2d/unet2d_vm_light.py b/pymic/net/net2d/unet2d_vm_light.py
deleted file mode 100644
index ab1de76..0000000
--- a/pymic/net/net2d/unet2d_vm_light.py
+++ /dev/null
@@ -1,284 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-
-import math
-import torch
-from torch import nn
-import torch.nn.functional as F
-
-from timm.models.layers import trunc_normal_
-from mamba_ssm import Mamba
-
-
-class PVMLayer(nn.Module):
- def __init__(self, input_dim, output_dim, d_state = 16, d_conv = 4, expand = 2):
- super().__init__()
- self.input_dim = input_dim
- self.output_dim = output_dim
- self.norm = nn.LayerNorm(input_dim)
- self.mamba = Mamba(
- d_model=input_dim//4, # Model dimension d_model
- d_state=d_state, # SSM state expansion factor
- d_conv=d_conv, # Local convolution width
- expand=expand, # Block expansion factor
- )
- self.proj = nn.Linear(input_dim, output_dim)
- self.skip_scale= nn.Parameter(torch.ones(1))
-
- def forward(self, x):
- if x.dtype == torch.float16:
- x = x.type(torch.float32)
- B, C = x.shape[:2]
- assert C == self.input_dim
- n_tokens = x.shape[2:].numel()
- img_dims = x.shape[2:]
- x_flat = x.reshape(B, C, n_tokens).transpose(-1, -2)
- x_norm = self.norm(x_flat)
-
- x1, x2, x3, x4 = torch.chunk(x_norm, 4, dim=2)
- x_mamba1 = self.mamba(x1) + self.skip_scale * x1
- x_mamba2 = self.mamba(x2) + self.skip_scale * x2
- x_mamba3 = self.mamba(x3) + self.skip_scale * x3
- x_mamba4 = self.mamba(x4) + self.skip_scale * x4
- x_mamba = torch.cat([x_mamba1, x_mamba2,x_mamba3,x_mamba4], dim=2)
-
- x_mamba = self.norm(x_mamba)
- x_mamba = self.proj(x_mamba)
- out = x_mamba.transpose(-1, -2).reshape(B, self.output_dim, *img_dims)
- return out
-
-
-class Channel_Att_Bridge(nn.Module):
- def __init__(self, c_list, split_att='fc'):
- super().__init__()
- c_list_sum = sum(c_list) - c_list[-1]
- self.split_att = split_att
- self.avgpool = nn.AdaptiveAvgPool2d(1)
- self.get_all_att = nn.Conv1d(1, 1, kernel_size=3, padding=1, bias=False)
- self.att1 = nn.Linear(c_list_sum, c_list[0]) if split_att == 'fc' else nn.Conv1d(c_list_sum, c_list[0], 1)
- self.att2 = nn.Linear(c_list_sum, c_list[1]) if split_att == 'fc' else nn.Conv1d(c_list_sum, c_list[1], 1)
- self.att3 = nn.Linear(c_list_sum, c_list[2]) if split_att == 'fc' else nn.Conv1d(c_list_sum, c_list[2], 1)
- self.att4 = nn.Linear(c_list_sum, c_list[3]) if split_att == 'fc' else nn.Conv1d(c_list_sum, c_list[3], 1)
- self.att5 = nn.Linear(c_list_sum, c_list[4]) if split_att == 'fc' else nn.Conv1d(c_list_sum, c_list[4], 1)
- self.sigmoid = nn.Sigmoid()
-
- def forward(self, t1, t2, t3, t4, t5):
- att = torch.cat((self.avgpool(t1),
- self.avgpool(t2),
- self.avgpool(t3),
- self.avgpool(t4),
- self.avgpool(t5)), dim=1)
- att = self.get_all_att(att.squeeze(-1).transpose(-1, -2))
- if self.split_att != 'fc':
- att = att.transpose(-1, -2)
- att1 = self.sigmoid(self.att1(att))
- att2 = self.sigmoid(self.att2(att))
- att3 = self.sigmoid(self.att3(att))
- att4 = self.sigmoid(self.att4(att))
- att5 = self.sigmoid(self.att5(att))
- if self.split_att == 'fc':
- att1 = att1.transpose(-1, -2).unsqueeze(-1).expand_as(t1)
- att2 = att2.transpose(-1, -2).unsqueeze(-1).expand_as(t2)
- att3 = att3.transpose(-1, -2).unsqueeze(-1).expand_as(t3)
- att4 = att4.transpose(-1, -2).unsqueeze(-1).expand_as(t4)
- att5 = att5.transpose(-1, -2).unsqueeze(-1).expand_as(t5)
- else:
- att1 = att1.unsqueeze(-1).expand_as(t1)
- att2 = att2.unsqueeze(-1).expand_as(t2)
- att3 = att3.unsqueeze(-1).expand_as(t3)
- att4 = att4.unsqueeze(-1).expand_as(t4)
- att5 = att5.unsqueeze(-1).expand_as(t5)
-
- return att1, att2, att3, att4, att5
-
-
-class Spatial_Att_Bridge(nn.Module):
- def __init__(self):
- super().__init__()
- self.shared_conv2d = nn.Sequential(nn.Conv2d(2, 1, 7, stride=1, padding=9, dilation=3),
- nn.Sigmoid())
-
- def forward(self, t1, t2, t3, t4, t5):
- t_list = [t1, t2, t3, t4, t5]
- att_list = []
- for t in t_list:
- avg_out = torch.mean(t, dim=1, keepdim=True)
- max_out, _ = torch.max(t, dim=1, keepdim=True)
- att = torch.cat([avg_out, max_out], dim=1)
- att = self.shared_conv2d(att)
- att_list.append(att)
- return att_list[0], att_list[1], att_list[2], att_list[3], att_list[4]
-
-
-class SC_Att_Bridge(nn.Module):
- def __init__(self, c_list, split_att='fc'):
- super().__init__()
-
- self.catt = Channel_Att_Bridge(c_list, split_att=split_att)
- self.satt = Spatial_Att_Bridge()
-
- def forward(self, t1, t2, t3, t4, t5):
- r1, r2, r3, r4, r5 = t1, t2, t3, t4, t5
-
- satt1, satt2, satt3, satt4, satt5 = self.satt(t1, t2, t3, t4, t5)
- t1, t2, t3, t4, t5 = satt1 * t1, satt2 * t2, satt3 * t3, satt4 * t4, satt5 * t5
-
- r1_, r2_, r3_, r4_, r5_ = t1, t2, t3, t4, t5
- t1, t2, t3, t4, t5 = t1 + r1, t2 + r2, t3 + r3, t4 + r4, t5 + r5
-
- catt1, catt2, catt3, catt4, catt5 = self.catt(t1, t2, t3, t4, t5)
- t1, t2, t3, t4, t5 = catt1 * t1, catt2 * t2, catt3 * t3, catt4 * t4, catt5 * t5
-
- return t1 + r1_, t2 + r2_, t3 + r3_, t4 + r4_, t5 + r5_
-
-
-class UltraLight_VM_UNet(nn.Module):
- def __init__(self, params):
- """
- UltraLight_VM_UNet that is a lightweight model using CNN and Mamba.
-
- * Reference: Renkai Wu, Yinghao Liu, Pengchen Liang, Qing Chang.
- UltraLight VM-UNet: Parallel Vision Mamba Significantly Reduces Parameters for Skin Lesion Segmentation.
- arxiv 2403.20035, 2024.
-
- The implementation is based on the code at:
- https://github.com/wurenkai/UltraLight-VM-UNet.
-
- The parameters for the backbone should be given in the `params` dictionary.
-
- :param in_chns: (int) Input channel number.
- :param class_num: (int) The class number for segmentation task.
- :param feature_chns: (list) Feature channel for each resolution level.
- The length should be 6, by default it is [8, 16, 24, 32, 48, 64].
- :param bridge: (bool) If the bridge based on spatial and channel attentions is used or not.
- By default it is True.
- """
- super(UltraLight_VM_UNet, self).__init__()
-
- input_channels = params['in_chns']
- num_classes = params['class_num']
- c_list = params.get('feature_chns', [8, 16, 24, 32, 48, 64])
- self.bridge = params.get('bridge', True)
- split_att = 'fc'
- # def __init__(self, num_classes=1, input_channels=3, c_list=[8,16,24,32,48,64],
- # split_att='fc', bridge=True):
- # super().__init__()
- # self.bridge = bridge
-
- self.encoder1 = nn.Sequential(
- nn.Conv2d(input_channels, c_list[0], 3, stride=1, padding=1),
- )
- self.encoder2 =nn.Sequential(
- nn.Conv2d(c_list[0], c_list[1], 3, stride=1, padding=1),
- )
- self.encoder3 = nn.Sequential(
- nn.Conv2d(c_list[1], c_list[2], 3, stride=1, padding=1),
- )
- self.encoder4 = nn.Sequential(
- PVMLayer(input_dim=c_list[2], output_dim=c_list[3])
- )
- self.encoder5 = nn.Sequential(
- PVMLayer(input_dim=c_list[3], output_dim=c_list[4])
- )
- self.encoder6 = nn.Sequential(
- PVMLayer(input_dim=c_list[4], output_dim=c_list[5])
- )
-
- if self.bridge:
- self.scab = SC_Att_Bridge(c_list, split_att)
- print('SC_Att_Bridge was used')
-
- self.decoder1 = nn.Sequential(
- PVMLayer(input_dim=c_list[5], output_dim=c_list[4])
- )
- self.decoder2 = nn.Sequential(
- PVMLayer(input_dim=c_list[4], output_dim=c_list[3])
- )
- self.decoder3 = nn.Sequential(
- PVMLayer(input_dim=c_list[3], output_dim=c_list[2])
- )
- self.decoder4 = nn.Sequential(
- nn.Conv2d(c_list[2], c_list[1], 3, stride=1, padding=1),
- )
- self.decoder5 = nn.Sequential(
- nn.Conv2d(c_list[1], c_list[0], 3, stride=1, padding=1),
- )
- self.ebn1 = nn.GroupNorm(4, c_list[0])
- self.ebn2 = nn.GroupNorm(4, c_list[1])
- self.ebn3 = nn.GroupNorm(4, c_list[2])
- self.ebn4 = nn.GroupNorm(4, c_list[3])
- self.ebn5 = nn.GroupNorm(4, c_list[4])
- self.dbn1 = nn.GroupNorm(4, c_list[4])
- self.dbn2 = nn.GroupNorm(4, c_list[3])
- self.dbn3 = nn.GroupNorm(4, c_list[2])
- self.dbn4 = nn.GroupNorm(4, c_list[1])
- self.dbn5 = nn.GroupNorm(4, c_list[0])
-
- self.final = nn.Conv2d(c_list[0], num_classes, kernel_size=1)
-
- self.apply(self._init_weights)
-
- def _init_weights(self, m):
- if isinstance(m, nn.Linear):
- trunc_normal_(m.weight, std=.02)
- if isinstance(m, nn.Linear) and m.bias is not None:
- nn.init.constant_(m.bias, 0)
- elif isinstance(m, nn.Conv1d):
- n = m.kernel_size[0] * m.out_channels
- m.weight.data.normal_(0, math.sqrt(2. / n))
- elif isinstance(m, nn.Conv2d):
- fan_out = m.kernel_size[0] * m.kernel_size[1] * m.out_channels
- fan_out //= m.groups
- m.weight.data.normal_(0, math.sqrt(2.0 / fan_out))
- if m.bias is not None:
- m.bias.data.zero_()
-
- def forward(self, x):
- x_shape = list(x.shape)
- if(len(x_shape) == 5):
- [N, C, D, H, W] = x_shape
- new_shape = [N*D, C, H, W]
- x = torch.transpose(x, 1, 2)
- x = torch.reshape(x, new_shape)
-
- out = F.gelu(F.max_pool2d(self.ebn1(self.encoder1(x)),2,2))
- t1 = out # b, c0, H/2, W/2
-
- out = F.gelu(F.max_pool2d(self.ebn2(self.encoder2(out)),2,2))
- t2 = out # b, c1, H/4, W/4
-
- out = F.gelu(F.max_pool2d(self.ebn3(self.encoder3(out)),2,2))
- t3 = out # b, c2, H/8, W/8
-
- out = F.gelu(F.max_pool2d(self.ebn4(self.encoder4(out)),2,2))
- t4 = out # b, c3, H/16, W/16
-
- out = F.gelu(F.max_pool2d(self.ebn5(self.encoder5(out)),2,2))
- t5 = out # b, c4, H/32, W/32
-
- if self.bridge: t1, t2, t3, t4, t5 = self.scab(t1, t2, t3, t4, t5)
-
- out = F.gelu(self.encoder6(out)) # b, c5, H/32, W/32
-
- out5 = F.gelu(self.dbn1(self.decoder1(out))) # b, c4, H/32, W/32
- out5 = torch.add(out5, t5) # b, c4, H/32, W/32
-
- out4 = F.gelu(F.interpolate(self.dbn2(self.decoder2(out5)),scale_factor=(2,2),mode ='bilinear',align_corners=True)) # b, c3, H/16, W/16
- out4 = torch.add(out4, t4) # b, c3, H/16, W/16
-
- out3 = F.gelu(F.interpolate(self.dbn3(self.decoder3(out4)),scale_factor=(2,2),mode ='bilinear',align_corners=True)) # b, c2, H/8, W/8
- out3 = torch.add(out3, t3) # b, c2, H/8, W/8
-
- out2 = F.gelu(F.interpolate(self.dbn4(self.decoder4(out3)),scale_factor=(2,2),mode ='bilinear',align_corners=True)) # b, c1, H/4, W/4
- out2 = torch.add(out2, t2) # b, c1, H/4, W/4
-
- out1 = F.gelu(F.interpolate(self.dbn5(self.decoder5(out2)),scale_factor=(2,2),mode ='bilinear',align_corners=True)) # b, c0, H/2, W/2
- out1 = torch.add(out1, t1) # b, c0, H/2, W/2
-
- out0 = F.interpolate(self.final(out1),scale_factor=(2,2),mode ='bilinear',align_corners=True) # b, num_class, H, W
-
- if(len(x_shape) == 5):
- new_shape = [N, D] + list(out0.shape)[1:]
- out0 = torch.transpose(torch.reshape(out0, new_shape), 1, 2)
- return out0
-
diff --git a/pymic/net/net3d/__init__.py b/pymic/net/net3d/__init__.py
deleted file mode 100644
index 72b8078..0000000
--- a/pymic/net/net3d/__init__.py
+++ /dev/null
@@ -1,2 +0,0 @@
-from __future__ import absolute_import
-from . import *
\ No newline at end of file
diff --git a/pymic/net/net3d/fmunet.py b/pymic/net/net3d/fmunet.py
deleted file mode 100644
index 84ee385..0000000
--- a/pymic/net/net3d/fmunet.py
+++ /dev/null
@@ -1,265 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-
-import itertools
-import logging
-import torch
-import torch.nn as nn
-from pymic.net.net_init import Initialization_He, Initialization_XavierUniform
-
-'''
-A copy of fmunetv3, and rename the class as FMUNet.
-'''
-dim0 = {0:3, 1:2, 2:2}
-dim1 = {0:3, 1:3, 2:2}
-conv_knl = {2: (1, 3, 3), 3: 3}
-conv_pad = {2: (0, 1, 1), 3: 1}
-pool_knl = {2: (1, 2, 2), 3: 2}
-down_stride = {2: (1, 2, 2), 3: 2}
-
-class ResConv(nn.Module):
- def __init__(self, out_channels, dim = 3, dropout_p = 0.0, depth = 2):
- super(ResConv, self).__init__()
- assert(dim == 2 or dim == 3)
- self.out_channels = out_channels
- self.conv_list = nn.ModuleList([nn.Sequential(
- nn.InstanceNorm3d(out_channels, affine = True),
- nn.LeakyReLU(),
- nn.Dropout(dropout_p),
- nn.Conv3d(out_channels, out_channels, kernel_size=conv_knl[dim], padding=conv_pad[dim]))
- for i in range(depth)])
-
- def forward(self, x):
- for conv in self.conv_list:
- x = conv(x) + x
- return x
-
-class DownSample(nn.Module):
- """downsampling based on convolution
-
- :param in_channels: (int) Input channel number.
- :param out_channels: (int) Output channel number.
- :param dim: (int) Should be 2 or 3, for 2D and 3D convolution, respectively.
- :param dropout_p: (int) Dropout probability.
- :param downsample: (bool) Use downsample or not after convolution.
- """
- def __init__(self, in_channels, out_channels, dim = 3):
- super(DownSample, self).__init__()
- self.down = nn.Sequential(
- nn.InstanceNorm3d(in_channels, affine = True),
- nn.LeakyReLU(),
- nn.Conv3d(in_channels, out_channels, kernel_size=conv_knl[dim],
- padding=conv_pad[dim], stride = down_stride[dim])
- )
-
- def forward(self, x):
- return self.down(x)
-
-class UpCatConv(nn.Module):
- """Upsampling followed by `ResConv` block
-
- :param in_channels1: (int) Input channel number for low-resolution feature map.
- :param in_channels2: (int) Input channel number for high-resolution feature map.
- :param out_channels: (int) Output channel number.
- :param dim: (int) Should be 2 or 3, for 2D and 3D convolution, respectively.
- :param dropout_p: (int) Dropout probability.
- :param up_mode: (string or int) The mode for upsampling. The allowed values are:
- 0 (or `TransConv`), 1 (`Nearest`), 2 (`Trilinear` for 3D and `Bilinear` for 2D).
- The default value is 2.
- """
- def __init__(self, in_channels1, in_channels2, out_channels, dim = 3):
- super(UpCatConv, self).__init__()
-
- self.up = nn.Sequential(
- nn.InstanceNorm3d(in_channels1, affine = True),
- nn.LeakyReLU(),
- nn.Conv3d(in_channels1, in_channels2, kernel_size=1, padding=0),
- nn.Upsample(scale_factor=pool_knl[dim], mode='trilinear', align_corners=True)
- )
-
- self.conv = nn.Sequential(
- nn.InstanceNorm3d(in_channels2*2, affine = True),
- nn.LeakyReLU(),
- nn.Conv3d(in_channels2 * 2, out_channels, kernel_size=conv_knl[dim], padding=conv_pad[dim])
- )
-
- def forward(self, x_l, x_h):
- """
- x_l: low-resolution feature map.
- x_h: high-resolution feature map.
- """
- y = torch.cat([x_h, self.up(x_l)], dim=1)
- return self.conv(y)
-
-class Encoder(nn.Module):
- """
- A modification of the encoder of 3D UNet by using ConvScSEBlock3D
-
- Parameters are given in the `params` dictionary.
- See :mod:`pymic.net.net3d.unet3d.Encoder` for details.
-
- res_mode: resolution mode: 0-- isotrpic, 1-- near isotrpic, 2-- isotropic
- """
- def __init__(self, ft_chns, res_mode = 0, dropout_p = 0, depth = 2):
- super(Encoder, self).__init__()
- d0, d1 = dim0[res_mode], dim1[res_mode]
-
- self.en_conv0 = ResConv(ft_chns[0], d0, 0, depth)
- self.en_conv1 = ResConv(ft_chns[1], d1, 0, depth)
- self.en_conv2 = ResConv(ft_chns[2], 3, dropout_p, depth)
- self.en_conv3 = ResConv(ft_chns[3], 3, dropout_p, depth)
- self.en_conv4 = ResConv(ft_chns[4], 3, dropout_p, depth)
-
- self.down0 = DownSample(ft_chns[0], ft_chns[1], d0)
- self.down1 = DownSample(ft_chns[1], ft_chns[2], d1)
- self.down2 = DownSample(ft_chns[2], ft_chns[3], 3)
- self.down3 = DownSample(ft_chns[3], ft_chns[4], 3)
-
- def forward(self, x):
- x0 = self.en_conv0(x)
- x1 = self.en_conv1(self.down0(x0))
- x2 = self.en_conv2(self.down1(x1))
- x3 = self.en_conv3(self.down2(x2))
- x4 = self.en_conv4(self.down3(x3))
- return [x0, x1, x2, x3, x4]
-
-class Decoder(nn.Module):
- """
- A modification of the encoder of 3D UNet by using ConvScSEBlock3D
-
- Parameters are given in the `params` dictionary.
- See :mod:`pymic.net.net3d.unet3d.Encoder` for details.
- """
- def __init__(self, ft_chns, res_mode = 0, dropout_p = 0, depth = 2):
- super(Decoder, self).__init__()
- d0, d1 = dim0[res_mode], dim1[res_mode]
-
- self.upcat0 = UpCatConv(ft_chns[1], ft_chns[0], ft_chns[0], d0)
- self.upcat1 = UpCatConv(ft_chns[2], ft_chns[1], ft_chns[1], d1)
- self.upcat2 = UpCatConv(ft_chns[3], ft_chns[2], ft_chns[2], 3)
- self.upcat3 = UpCatConv(ft_chns[4], ft_chns[3], ft_chns[3], 3)
-
- self.de_conv0 = ResConv(ft_chns[0], d0, 0, depth)
- self.de_conv1 = ResConv(ft_chns[1], d1, 0, depth)
- self.de_conv2 = ResConv(ft_chns[2], 3, dropout_p, depth)
- self.de_conv3 = ResConv(ft_chns[3], 3, dropout_p, depth)
- self.de_conv4 = ResConv(ft_chns[4], 3, dropout_p, depth)
-
- def forward(self, x):
- x0, x1, x2, x3, x4 = x
- x4_de = self.de_conv4(x4)
- x3_de = self.de_conv3(self.upcat3(x4_de, x3))
- x2_de = self.de_conv2(self.upcat2(x3_de, x2))
- x1_de = self.de_conv1(self.upcat1(x2_de, x1))
- x0_de = self.de_conv0(self.upcat0(x1_de, x0))
- return [x0_de, x1_de, x2_de, x3_de]
-
-class FMUNet(nn.Module):
- """
- A 2.5D network combining 3D convolutions with 2D convolutions.
-
- * Reference: Guotai Wang, Jonathan Shapey, Wenqi Li, Reuben Dorent, Alex Demitriadis,
- Sotirios Bisdas, Ian Paddick, Robert Bradford, Shaoting Zhang, Sébastien Ourselin,
- Tom Vercauteren: Automatic Segmentation of Vestibular Schwannoma from T2-Weighted
- MRI by Deep Spatial Attention with Hardness-Weighted Loss.
- `MICCAI (2) 2019: 264-272. `_
-
- Note that the attention module in the orininal paper is not used here.
-
- Parameters are given in the `params` dictionary, and should include the
- following fields:
-
- :param in_chns: (int) Input channel number.
- :param feature_chns: (list) Feature channel for each resolution level.
- The length should be 5, such as [16, 32, 64, 128, 256].
- :param dropout: (list) The dropout ratio for each resolution level.
- The length should be the same as that of `feature_chns`.
- :param conv_dims: (list) The convolution dimension (2 or 3) for each resolution level.
- The length should be the same as that of `feature_chns`.
- :param class_num: (int) The class number for segmentation task.
- :param up_mode: (string or int) The mode for upsampling. The allowed values are:
- 0 (or `TransConv`), 1 (`Nearest`), 2 (`Trilinear`). The default value
- is 2 (`Trilinear`).
- :param multiscale_pred: (bool) Get multi-scale prediction.
- """
- def __init__(self, params):
- super(FMUNet, self).__init__()
- params = self.get_default_parameters(params)
-
- self.stage = 'train'
- in_chns = params['in_chns']
- ft_chns = params['feature_chns']
- res_mode = params['res_mode']
- dropout = params['dropout']
- depth = params['depth']
- cls_num = params['class_num']
- self.mul_pred = params.get('multiscale_pred', True)
- self.tune_mode= params.get('finetune_mode', 'all')
- self.load_mode= params.get('weights_load_mode', 'all')
-
- d0 = dim0[res_mode]
- self.project = nn.Conv3d(in_chns, ft_chns[0], kernel_size=conv_knl[d0], padding=conv_pad[d0])
- self.encoder = Encoder(ft_chns, res_mode, dropout, depth)
- # self.decoder = Decoder(ft_chns, res_mode, dropout, depth = 2)
- self.decoder = Decoder(ft_chns, res_mode, dropout, depth)
-
- self.out_layers = nn.ModuleList()
- dims = [dim0[res_mode], dim1[res_mode], 3, 3]
- for i in range(4):
- out_layer = nn.Sequential(
- nn.InstanceNorm3d(ft_chns[i], affine = True),
- nn.LeakyReLU(),
- nn.Conv3d(ft_chns[i], cls_num, kernel_size=conv_knl[dims[i]], padding=conv_pad[dims[i]]))
- self.out_layers.append(out_layer)
-
- init = params['initialization'].lower()
- weightInitializer = Initialization_He(1e-2) if init == 'he' else Initialization_XavierUniform()
- self.apply(weightInitializer)
-
- def get_default_parameters(self, params):
- default_param = {
- 'finetune_mode': 'all',
- 'initialization': 'he',
- 'feature_chns': [32, 64, 128, 256, 512],
- 'dropout': 0.2,
- 'res_mode': 0,
- 'depth': 2,
- 'multiscale_pred': True
- }
- for key in default_param:
- params[key] = params.get(key, default_param[key])
- for key in params:
- logging.info("{0:} = {1:}".format(key, params[key]))
- return params
-
- def set_stage(self, stage):
- self.stage = stage
-
- def forward(self, x):
- x_en = self.encoder(self.project(x))
- x_de = self.decoder(x_en)
- output = self.out_layers[0](x_de[0])
- if(self.mul_pred and self.stage == 'train'):
- output = [output]
- for i in range(1, len(x_de)):
- output.append(self.out_layers[i](x_de[i]))
- return output
-
- def get_parameters_to_update(self):
- if(self.tune_mode == 'all'):
- return self.parameters()
-
- up_params = itertools.chain()
- if(self.tune_mode == 'decoder'):
- up_blocks = [self.decoder, self.out_layers]
- else:
- raise ValueError("undefined fine-tune mode for FMUNet: {0:}".format(self.tune_mode))
- for block in up_blocks:
- up_params = itertools.chain(up_params, block.parameters())
- return up_params
-
- def get_parameters_to_load(self):
- state_dict = self.state_dict()
- if(self.load_mode == 'encoder'):
- state_dict = {k:v for k, v in state_dict.items() if "project" in k or "encoder" in k }
- return state_dict
\ No newline at end of file
diff --git a/pymic/net/net3d/fmunetv3.py b/pymic/net/net3d/fmunetv3.py
deleted file mode 100644
index 1367209..0000000
--- a/pymic/net/net3d/fmunetv3.py
+++ /dev/null
@@ -1,262 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-
-import itertools
-import logging
-import torch
-import torch.nn as nn
-from pymic.net.net_init import Initialization_He, Initialization_XavierUniform
-
-dim0 = {0:3, 1:2, 2:2}
-dim1 = {0:3, 1:3, 2:2}
-conv_knl = {2: (1, 3, 3), 3: 3}
-conv_pad = {2: (0, 1, 1), 3: 1}
-pool_knl = {2: (1, 2, 2), 3: 2}
-down_stride = {2: (1, 2, 2), 3: 2}
-
-class ResConv(nn.Module):
- def __init__(self, out_channels, dim = 3, dropout_p = 0.0, depth = 2):
- super(ResConv, self).__init__()
- assert(dim == 2 or dim == 3)
- self.out_channels = out_channels
- self.conv_list = nn.ModuleList([nn.Sequential(
- nn.InstanceNorm3d(out_channels, affine = True),
- nn.LeakyReLU(),
- nn.Dropout(dropout_p),
- nn.Conv3d(out_channels, out_channels, kernel_size=conv_knl[dim], padding=conv_pad[dim]))
- for i in range(depth)])
-
- def forward(self, x):
- for conv in self.conv_list:
- x = conv(x) + x
- return x
-
-class DownSample(nn.Module):
- """downsampling based on convolution
-
- :param in_channels: (int) Input channel number.
- :param out_channels: (int) Output channel number.
- :param dim: (int) Should be 2 or 3, for 2D and 3D convolution, respectively.
- :param dropout_p: (int) Dropout probability.
- :param downsample: (bool) Use downsample or not after convolution.
- """
- def __init__(self, in_channels, out_channels, dim = 3):
- super(DownSample, self).__init__()
- self.down = nn.Sequential(
- nn.InstanceNorm3d(in_channels, affine = True),
- nn.LeakyReLU(),
- nn.Conv3d(in_channels, out_channels, kernel_size=conv_knl[dim],
- padding=conv_pad[dim], stride = down_stride[dim])
- )
-
- def forward(self, x):
- return self.down(x)
-
-class UpCatConv(nn.Module):
- """Upsampling followed by `ResConv` block
-
- :param in_channels1: (int) Input channel number for low-resolution feature map.
- :param in_channels2: (int) Input channel number for high-resolution feature map.
- :param out_channels: (int) Output channel number.
- :param dim: (int) Should be 2 or 3, for 2D and 3D convolution, respectively.
- :param dropout_p: (int) Dropout probability.
- :param up_mode: (string or int) The mode for upsampling. The allowed values are:
- 0 (or `TransConv`), 1 (`Nearest`), 2 (`Trilinear` for 3D and `Bilinear` for 2D).
- The default value is 2.
- """
- def __init__(self, in_channels1, in_channels2, out_channels, dim = 3):
- super(UpCatConv, self).__init__()
-
- self.up = nn.Sequential(
- nn.InstanceNorm3d(in_channels1, affine = True),
- nn.LeakyReLU(),
- nn.Conv3d(in_channels1, in_channels2, kernel_size=1, padding=0),
- nn.Upsample(scale_factor=pool_knl[dim], mode='trilinear', align_corners=True)
- )
-
- self.conv = nn.Sequential(
- nn.InstanceNorm3d(in_channels2*2, affine = True),
- nn.LeakyReLU(),
- nn.Conv3d(in_channels2 * 2, out_channels, kernel_size=conv_knl[dim], padding=conv_pad[dim])
- )
-
- def forward(self, x_l, x_h):
- """
- x_l: low-resolution feature map.
- x_h: high-resolution feature map.
- """
- y = torch.cat([x_h, self.up(x_l)], dim=1)
- return self.conv(y)
-
-class Encoder(nn.Module):
- """
- A modification of the encoder of 3D UNet by using ConvScSEBlock3D
-
- Parameters are given in the `params` dictionary.
- See :mod:`pymic.net.net3d.unet3d.Encoder` for details.
-
- res_mode: resolution mode: 0-- isotrpic, 1-- near isotrpic, 2-- isotropic
- """
- def __init__(self, ft_chns, res_mode = 0, dropout_p = 0, depth = 2):
- super(Encoder, self).__init__()
- d0, d1 = dim0[res_mode], dim1[res_mode]
-
- self.en_conv0 = ResConv(ft_chns[0], d0, 0, depth)
- self.en_conv1 = ResConv(ft_chns[1], d1, 0, depth)
- self.en_conv2 = ResConv(ft_chns[2], 3, dropout_p, depth)
- self.en_conv3 = ResConv(ft_chns[3], 3, dropout_p, depth)
- self.en_conv4 = ResConv(ft_chns[4], 3, dropout_p, depth)
-
- self.down0 = DownSample(ft_chns[0], ft_chns[1], d0)
- self.down1 = DownSample(ft_chns[1], ft_chns[2], d1)
- self.down2 = DownSample(ft_chns[2], ft_chns[3], 3)
- self.down3 = DownSample(ft_chns[3], ft_chns[4], 3)
-
- def forward(self, x):
- x0 = self.en_conv0(x)
- x1 = self.en_conv1(self.down0(x0))
- x2 = self.en_conv2(self.down1(x1))
- x3 = self.en_conv3(self.down2(x2))
- x4 = self.en_conv4(self.down3(x3))
- return [x0, x1, x2, x3, x4]
-
-class Decoder(nn.Module):
- """
- A modification of the encoder of 3D UNet by using ConvScSEBlock3D
-
- Parameters are given in the `params` dictionary.
- See :mod:`pymic.net.net3d.unet3d.Encoder` for details.
- """
- def __init__(self, ft_chns, res_mode = 0, dropout_p = 0, depth = 2):
- super(Decoder, self).__init__()
- d0, d1 = dim0[res_mode], dim1[res_mode]
-
- self.upcat0 = UpCatConv(ft_chns[1], ft_chns[0], ft_chns[0], d0)
- self.upcat1 = UpCatConv(ft_chns[2], ft_chns[1], ft_chns[1], d1)
- self.upcat2 = UpCatConv(ft_chns[3], ft_chns[2], ft_chns[2], 3)
- self.upcat3 = UpCatConv(ft_chns[4], ft_chns[3], ft_chns[3], 3)
-
- self.de_conv0 = ResConv(ft_chns[0], d0, 0, depth)
- self.de_conv1 = ResConv(ft_chns[1], d1, 0, depth)
- self.de_conv2 = ResConv(ft_chns[2], 3, dropout_p, depth)
- self.de_conv3 = ResConv(ft_chns[3], 3, dropout_p, depth)
- self.de_conv4 = ResConv(ft_chns[4], 3, dropout_p, depth)
-
- def forward(self, x):
- x0, x1, x2, x3, x4 = x
- x4_de = self.de_conv4(x4)
- x3_de = self.de_conv3(self.upcat3(x4_de, x3))
- x2_de = self.de_conv2(self.upcat2(x3_de, x2))
- x1_de = self.de_conv1(self.upcat1(x2_de, x1))
- x0_de = self.de_conv0(self.upcat0(x1_de, x0))
- return [x0_de, x1_de, x2_de, x3_de]
-
-class FMUNetV3(nn.Module):
- """
- A 2.5D network combining 3D convolutions with 2D convolutions.
-
- * Reference: Guotai Wang, Jonathan Shapey, Wenqi Li, Reuben Dorent, Alex Demitriadis,
- Sotirios Bisdas, Ian Paddick, Robert Bradford, Shaoting Zhang, Sébastien Ourselin,
- Tom Vercauteren: Automatic Segmentation of Vestibular Schwannoma from T2-Weighted
- MRI by Deep Spatial Attention with Hardness-Weighted Loss.
- `MICCAI (2) 2019: 264-272. `_
-
- Note that the attention module in the orininal paper is not used here.
-
- Parameters are given in the `params` dictionary, and should include the
- following fields:
-
- :param in_chns: (int) Input channel number.
- :param feature_chns: (list) Feature channel for each resolution level.
- The length should be 5, such as [16, 32, 64, 128, 256].
- :param dropout: (list) The dropout ratio for each resolution level.
- The length should be the same as that of `feature_chns`.
- :param conv_dims: (list) The convolution dimension (2 or 3) for each resolution level.
- The length should be the same as that of `feature_chns`.
- :param class_num: (int) The class number for segmentation task.
- :param up_mode: (string or int) The mode for upsampling. The allowed values are:
- 0 (or `TransConv`), 1 (`Nearest`), 2 (`Trilinear`). The default value
- is 2 (`Trilinear`).
- :param multiscale_pred: (bool) Get multi-scale prediction.
- """
- def __init__(self, params):
- super(FMUNetV3, self).__init__()
- params = self.get_default_parameters(params)
-
- self.stage = 'train'
- in_chns = params['in_chns']
- ft_chns = params['feature_chns']
- res_mode = params['res_mode']
- dropout = params['dropout']
- depth = params['depth']
- cls_num = params['class_num']
- self.mul_pred = params.get('multiscale_pred', True)
- self.tune_mode= params.get('finetune_mode', 'all')
- self.load_mode= params.get('weights_load_mode', 'all')
-
- d0 = dim0[res_mode]
- self.project = nn.Conv3d(in_chns, ft_chns[0], kernel_size=conv_knl[d0], padding=conv_pad[d0])
- self.encoder = Encoder(ft_chns, res_mode, dropout, depth)
- # self.decoder = Decoder(ft_chns, res_mode, dropout, depth = 2)
- self.decoder = Decoder(ft_chns, res_mode, dropout, depth)
-
- self.out_layers = nn.ModuleList()
- dims = [dim0[res_mode], dim1[res_mode], 3, 3]
- for i in range(4):
- out_layer = nn.Sequential(
- nn.InstanceNorm3d(ft_chns[i], affine = True),
- nn.LeakyReLU(),
- nn.Conv3d(ft_chns[i], cls_num, kernel_size=conv_knl[dims[i]], padding=conv_pad[dims[i]]))
- self.out_layers.append(out_layer)
-
- init = params['initialization'].lower()
- weightInitializer = Initialization_He(1e-2) if init == 'he' else Initialization_XavierUniform()
- self.apply(weightInitializer)
-
- def get_default_parameters(self, params):
- default_param = {
- 'finetune_mode': 'all',
- 'initialization': 'he',
- 'feature_chns': [32, 64, 128, 256, 512],
- 'dropout': 0.2,
- 'res_mode': 0,
- 'depth': 2,
- 'multiscale_pred': True
- }
- for key in default_param:
- params[key] = params.get(key, default_param[key])
- for key in params:
- logging.info("{0:} = {1:}".format(key, params[key]))
- return params
-
- def set_stage(self, stage):
- self.stage = stage
-
- def forward(self, x):
- x_en = self.encoder(self.project(x))
- x_de = self.decoder(x_en)
- output = self.out_layers[0](x_de[0])
- if(self.mul_pred and self.stage == 'train'):
- output = [output]
- for i in range(1, len(x_de)):
- output.append(self.out_layers[i](x_de[i]))
- return output
-
- def get_parameters_to_update(self):
- if(self.tune_mode == 'all'):
- return self.parameters()
-
- up_params = itertools.chain()
- if(self.tune_mode == 'decoder'):
- up_blocks = [self.decoder, self.out_layers]
- else:
- raise ValueError("undefined fine-tune mode for FMUNet: {0:}".format(self.tune_mode))
- for block in up_blocks:
- up_params = itertools.chain(up_params, block.parameters())
- return up_params
-
- def get_parameters_to_load(self):
- state_dict = self.state_dict()
- if(self.load_mode == 'encoder'):
- state_dict = {k:v for k, v in state_dict.items() if "project" in k or "encoder" in k }
- return state_dict
\ No newline at end of file
diff --git a/pymic/net/net3d/grunet.py b/pymic/net/net3d/grunet.py
deleted file mode 100644
index bae6447..0000000
--- a/pymic/net/net3d/grunet.py
+++ /dev/null
@@ -1,264 +0,0 @@
-# -*- coding: utf-8 -*-
-# Note: this is a renamed version of fmunetv3. fmunetv3 will be removed in a later version.
-# This network is originally used in the VolF paper.
-from __future__ import print_function, division
-
-import itertools
-import logging
-import torch
-import torch.nn as nn
-from pymic.net.net_init import Initialization_He, Initialization_XavierUniform
-
-dim0 = {0:3, 1:2, 2:2}
-dim1 = {0:3, 1:3, 2:2}
-conv_knl = {2: (1, 3, 3), 3: 3}
-conv_pad = {2: (0, 1, 1), 3: 1}
-pool_knl = {2: (1, 2, 2), 3: 2}
-down_stride = {2: (1, 2, 2), 3: 2}
-
-class ResConv(nn.Module):
- def __init__(self, out_channels, dim = 3, dropout_p = 0.0, depth = 2):
- super(ResConv, self).__init__()
- assert(dim == 2 or dim == 3)
- self.out_channels = out_channels
- self.conv_list = nn.ModuleList([nn.Sequential(
- nn.InstanceNorm3d(out_channels, affine = True),
- nn.LeakyReLU(),
- nn.Dropout(dropout_p),
- nn.Conv3d(out_channels, out_channels, kernel_size=conv_knl[dim], padding=conv_pad[dim]))
- for i in range(depth)])
-
- def forward(self, x):
- for conv in self.conv_list:
- x = conv(x) + x
- return x
-
-class DownSample(nn.Module):
- """downsampling based on convolution
-
- :param in_channels: (int) Input channel number.
- :param out_channels: (int) Output channel number.
- :param dim: (int) Should be 2 or 3, for 2D and 3D convolution, respectively.
- :param dropout_p: (int) Dropout probability.
- :param downsample: (bool) Use downsample or not after convolution.
- """
- def __init__(self, in_channels, out_channels, dim = 3):
- super(DownSample, self).__init__()
- self.down = nn.Sequential(
- nn.InstanceNorm3d(in_channels, affine = True),
- nn.LeakyReLU(),
- nn.Conv3d(in_channels, out_channels, kernel_size=conv_knl[dim],
- padding=conv_pad[dim], stride = down_stride[dim])
- )
-
- def forward(self, x):
- return self.down(x)
-
-class UpCatConv(nn.Module):
- """Upsampling followed by `ResConv` block
-
- :param in_channels1: (int) Input channel number for low-resolution feature map.
- :param in_channels2: (int) Input channel number for high-resolution feature map.
- :param out_channels: (int) Output channel number.
- :param dim: (int) Should be 2 or 3, for 2D and 3D convolution, respectively.
- :param dropout_p: (int) Dropout probability.
- :param up_mode: (string or int) The mode for upsampling. The allowed values are:
- 0 (or `TransConv`), 1 (`Nearest`), 2 (`Trilinear` for 3D and `Bilinear` for 2D).
- The default value is 2.
- """
- def __init__(self, in_channels1, in_channels2, out_channels, dim = 3):
- super(UpCatConv, self).__init__()
-
- self.up = nn.Sequential(
- nn.InstanceNorm3d(in_channels1, affine = True),
- nn.LeakyReLU(),
- nn.Conv3d(in_channels1, in_channels2, kernel_size=1, padding=0),
- nn.Upsample(scale_factor=pool_knl[dim], mode='trilinear', align_corners=True)
- )
-
- self.conv = nn.Sequential(
- nn.InstanceNorm3d(in_channels2*2, affine = True),
- nn.LeakyReLU(),
- nn.Conv3d(in_channels2 * 2, out_channels, kernel_size=conv_knl[dim], padding=conv_pad[dim])
- )
-
- def forward(self, x_l, x_h):
- """
- x_l: low-resolution feature map.
- x_h: high-resolution feature map.
- """
- y = torch.cat([x_h, self.up(x_l)], dim=1)
- return self.conv(y)
-
-class Encoder(nn.Module):
- """
- A modification of the encoder of 3D UNet by using ConvScSEBlock3D
-
- Parameters are given in the `params` dictionary.
- See :mod:`pymic.net.net3d.unet3d.Encoder` for details.
-
- res_mode: resolution mode: 0-- isotrpic, 1-- near isotrpic, 2-- isotropic
- """
- def __init__(self, ft_chns, res_mode = 0, dropout_p = 0, depth = 2):
- super(Encoder, self).__init__()
- d0, d1 = dim0[res_mode], dim1[res_mode]
-
- self.en_conv0 = ResConv(ft_chns[0], d0, 0, depth)
- self.en_conv1 = ResConv(ft_chns[1], d1, 0, depth)
- self.en_conv2 = ResConv(ft_chns[2], 3, dropout_p, depth)
- self.en_conv3 = ResConv(ft_chns[3], 3, dropout_p, depth)
- self.en_conv4 = ResConv(ft_chns[4], 3, dropout_p, depth)
-
- self.down0 = DownSample(ft_chns[0], ft_chns[1], d0)
- self.down1 = DownSample(ft_chns[1], ft_chns[2], d1)
- self.down2 = DownSample(ft_chns[2], ft_chns[3], 3)
- self.down3 = DownSample(ft_chns[3], ft_chns[4], 3)
-
- def forward(self, x):
- x0 = self.en_conv0(x)
- x1 = self.en_conv1(self.down0(x0))
- x2 = self.en_conv2(self.down1(x1))
- x3 = self.en_conv3(self.down2(x2))
- x4 = self.en_conv4(self.down3(x3))
- return [x0, x1, x2, x3, x4]
-
-class Decoder(nn.Module):
- """
- A modification of the encoder of 3D UNet by using ConvScSEBlock3D
-
- Parameters are given in the `params` dictionary.
- See :mod:`pymic.net.net3d.unet3d.Encoder` for details.
- """
- def __init__(self, ft_chns, res_mode = 0, dropout_p = 0, depth = 2):
- super(Decoder, self).__init__()
- d0, d1 = dim0[res_mode], dim1[res_mode]
-
- self.upcat0 = UpCatConv(ft_chns[1], ft_chns[0], ft_chns[0], d0)
- self.upcat1 = UpCatConv(ft_chns[2], ft_chns[1], ft_chns[1], d1)
- self.upcat2 = UpCatConv(ft_chns[3], ft_chns[2], ft_chns[2], 3)
- self.upcat3 = UpCatConv(ft_chns[4], ft_chns[3], ft_chns[3], 3)
-
- self.de_conv0 = ResConv(ft_chns[0], d0, 0, depth)
- self.de_conv1 = ResConv(ft_chns[1], d1, 0, depth)
- self.de_conv2 = ResConv(ft_chns[2], 3, dropout_p, depth)
- self.de_conv3 = ResConv(ft_chns[3], 3, dropout_p, depth)
- self.de_conv4 = ResConv(ft_chns[4], 3, dropout_p, depth)
-
- def forward(self, x):
- x0, x1, x2, x3, x4 = x
- x4_de = self.de_conv4(x4)
- x3_de = self.de_conv3(self.upcat3(x4_de, x3))
- x2_de = self.de_conv2(self.upcat2(x3_de, x2))
- x1_de = self.de_conv1(self.upcat1(x2_de, x1))
- x0_de = self.de_conv0(self.upcat0(x1_de, x0))
- return [x0_de, x1_de, x2_de, x3_de]
-
-class GRUNet(nn.Module):
- """
- A General Residual UNet.
-
- * Reference: Guotai Wang, Jonathan Shapey, Wenqi Li, Reuben Dorent, Alex Demitriadis,
- Sotirios Bisdas, Ian Paddick, Robert Bradford, Shaoting Zhang, Sébastien Ourselin,
- Tom Vercauteren: Automatic Segmentation of Vestibular Schwannoma from T2-Weighted
- MRI by Deep Spatial Attention with Hardness-Weighted Loss.
- `MICCAI (2) 2019: 264-272. `_
-
- Note that the attention module in the orininal paper is not used here.
-
- Parameters are given in the `params` dictionary, and should include the
- following fields:
-
- :param in_chns: (int) Input channel number.
- :param feature_chns: (list) Feature channel for each resolution level.
- The length should be 5, such as [16, 32, 64, 128, 256].
- :param dropout: (list) The dropout ratio for each resolution level.
- The length should be the same as that of `feature_chns`.
- :param conv_dims: (list) The convolution dimension (2 or 3) for each resolution level.
- The length should be the same as that of `feature_chns`.
- :param class_num: (int) The class number for segmentation task.
- :param up_mode: (string or int) The mode for upsampling. The allowed values are:
- 0 (or `TransConv`), 1 (`Nearest`), 2 (`Trilinear`). The default value
- is 2 (`Trilinear`).
- :param multiscale_pred: (bool) Get multi-scale prediction.
- """
- def __init__(self, params):
- super(GRUNet, self).__init__()
- params = self.get_default_parameters(params)
-
- self.stage = 'train'
- in_chns = params['in_chns']
- ft_chns = params['feature_chns']
- res_mode = params['res_mode']
- dropout = params['dropout']
- depth = params['depth']
- cls_num = params['class_num']
- self.mul_pred = params.get('multiscale_pred', True)
- self.tune_mode= params.get('finetune_mode', 'all')
- self.load_mode= params.get('weights_load_mode', 'all')
-
- d0 = dim0[res_mode]
- self.project = nn.Conv3d(in_chns, ft_chns[0], kernel_size=conv_knl[d0], padding=conv_pad[d0])
- self.encoder = Encoder(ft_chns, res_mode, dropout, depth)
- # self.decoder = Decoder(ft_chns, res_mode, dropout, depth = 2)
- self.decoder = Decoder(ft_chns, res_mode, dropout, depth)
-
- self.out_layers = nn.ModuleList()
- dims = [dim0[res_mode], dim1[res_mode], 3, 3]
- for i in range(4):
- out_layer = nn.Sequential(
- nn.InstanceNorm3d(ft_chns[i], affine = True),
- nn.LeakyReLU(),
- nn.Conv3d(ft_chns[i], cls_num, kernel_size=conv_knl[dims[i]], padding=conv_pad[dims[i]]))
- self.out_layers.append(out_layer)
-
- init = params['initialization'].lower()
- weightInitializer = Initialization_He(1e-2) if init == 'he' else Initialization_XavierUniform()
- self.apply(weightInitializer)
-
- def get_default_parameters(self, params):
- default_param = {
- 'finetune_mode': 'all',
- 'initialization': 'he',
- 'feature_chns': [32, 64, 128, 256, 512],
- 'dropout': 0.2,
- 'res_mode': 0,
- 'depth': 2,
- 'multiscale_pred': True
- }
- for key in default_param:
- params[key] = params.get(key, default_param[key])
- for key in params:
- logging.info("{0:} = {1:}".format(key, params[key]))
- return params
-
- def set_stage(self, stage):
- self.stage = stage
-
- def forward(self, x):
- x_en = self.encoder(self.project(x))
- x_de = self.decoder(x_en)
- output = self.out_layers[0](x_de[0])
- if(self.mul_pred and self.stage == 'train'):
- output = [output]
- for i in range(1, len(x_de)):
- output.append(self.out_layers[i](x_de[i]))
- return output
-
- def get_parameters_to_update(self):
- if(self.tune_mode == 'all'):
- return self.parameters()
-
- up_params = itertools.chain()
- if(self.tune_mode == 'decoder'):
- up_blocks = [self.decoder, self.out_layers]
- else:
- raise ValueError("undefined fine-tune mode for GRUNet: {0:}".format(self.tune_mode))
- for block in up_blocks:
- up_params = itertools.chain(up_params, block.parameters())
- return up_params
-
- def get_parameters_to_load(self):
- state_dict = self.state_dict()
- if(self.load_mode == 'encoder'):
- state_dict = {k:v for k, v in state_dict.items() if "project" in k or "encoder" in k }
- return state_dict
\ No newline at end of file
diff --git a/pymic/net/net3d/lcovnet.py b/pymic/net/net3d/lcovnet.py
deleted file mode 100644
index bd91878..0000000
--- a/pymic/net/net3d/lcovnet.py
+++ /dev/null
@@ -1,246 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-
-import logging
-import torch
-import torch.nn as nn
-import numpy as np
-from pymic.net.net_init import Initialization_He, Initialization_XavierUniform
-
-class UnetBlock_Encode(nn.Module):
- def __init__(self, in_channels, out_channel):
- super(UnetBlock_Encode, self).__init__()
-
- self.in_chns = in_channels
- self.out_chns = out_channel
-
- self.conv1 = nn.Sequential(
- nn.Conv3d(self.in_chns, self.out_chns, kernel_size=(1, 1, 3),
- padding=(0, 0, 1)),
- nn.BatchNorm3d(self.out_chns),
- nn.ReLU6(inplace=True)
- )
-
- self.conv2_1 = nn.Sequential(
- nn.Conv3d(self.out_chns, self.out_chns, kernel_size=(3, 3, 1),
- padding=(1, 1, 0), groups=1),
- nn.BatchNorm3d(self.out_chns),
- nn.ReLU6(inplace=True),
- nn.Dropout(p=0.2)
- )
-
- self.conv2_2 = nn.Sequential(
- nn.AvgPool3d(kernel_size=4, stride=2, padding=1),
- nn.Conv3d(self.out_chns, self.out_chns, kernel_size=1,
- padding=0),
- nn.BatchNorm3d(self.out_chns),
- nn.Upsample(scale_factor=2, mode='trilinear', align_corners=False)
- )
-
- def forward(self, x):
- # print(x.shape)
- x = self.conv1(x)
-
- x1 = self.conv2_1(x)
- x2 = self.conv2_2(x)
- x2 = torch.sigmoid(x2)
- x = x1 + x2 * x
- return x
-
-
-class UnetBlock_Encode_BottleNeck(nn.Module):
- def __init__(self, in_channels, out_channel):
- super(UnetBlock_Encode_BottleNeck, self).__init__()
-
- self.in_chns = in_channels
- self.out_chns = out_channel
-
- self.conv1 = nn.Sequential(
- nn.Conv3d(self.in_chns, self.out_chns, kernel_size=(1, 1, 3),
- padding=(0, 0, 1)),
- nn.BatchNorm3d(self.out_chns),
- nn.ReLU6(inplace=True)
- )
-
- self.conv2_1 = nn.Sequential(
- nn.Conv3d(self.out_chns, self.out_chns, kernel_size=(3, 3, 1),
- padding=(1, 1, 0), groups=self.out_chns),
- nn.BatchNorm3d(self.out_chns),
- nn.ReLU6(inplace=True),
- nn.Dropout(p=0.2)
- )
-
- self.conv2_2 = nn.Sequential(
- # nn.AvgPool3d(kernel_size=4, stride=2),
- nn.Conv3d(self.out_chns, self.out_chns, kernel_size=1,
- padding=0),
- nn.BatchNorm3d(self.out_chns),
- nn.ReLU6(inplace=True),
- nn.Dropout(p=0.2)
- )
-
- def forward(self, x):
- x = self.conv1(x)
-
- x1 = self.conv2_1(x)
- x2 = self.conv2_2(x)
- x2 = torch.sigmoid(x2)
- x = x1 + x2 * x
- return x
-
-
-class UnetBlock_Down(nn.Module):
- def __init__(self):
- super(UnetBlock_Down, self).__init__()
- self.avg_pool = nn.MaxPool3d(kernel_size=2, stride=2)
-
- def forward(self, x):
- x = self.avg_pool(x)
- return x
-
-
-class UnetBlock_Up(nn.Module):
- def __init__(self, in_channels, out_channel):
- super(UnetBlock_Up, self).__init__()
- self.conv = self.conv1 = nn.Sequential(
- nn.Conv3d(in_channels, out_channel, kernel_size=1,
- padding=0, groups=1),
- nn.BatchNorm3d(out_channel),
- nn.ReLU6(inplace=True),
- nn.Dropout(p=0.2)
- )
-
- self.up = nn.Upsample(
- scale_factor=2, mode='trilinear', align_corners=False)
-
- def forward(self, x):
- x = self.conv(x)
- x = self.up(x)
- return x
-
-
-class LCOVNet(nn.Module):
- """
- An implementation of the LCOVNet.
-
- * Reference: Q. Zhao, L. Zhong, J. Xiao, J. Zhang, Y. Chen , W. Liao, S. Zhang, and G. Wang:
- Efficient Multi-Organ Segmentation From 3D Abdominal CT Images With Lightweight Network and Knowledge Distillation.
- `IEEE TMI 42(9) 2023: 2513 - 2523. `_
-
- Parameters are given in the `params` dictionary, and should include the
- following fields:
-
- :param in_chns: (int) Input channel number.
- :param feature_chns: (list) Feature channel for each resolution level.
- The length should be 4 or 5, such as [16, 32, 64, 128, 256].
- :param dropout: (list) The dropout ratio for each resolution level.
- The length should be the same as that of `feature_chns`.
- :param class_num: (int) The class number for segmentation task.
- :param up_mode: (string or int) The mode for upsampling. The allowed values are:
- 0 (or `TransConv`), 1 (`Nearest`), 2 (`Trilinear`). The default value
- is 2 (`Trilinear`).
- :param multiscale_pred: (bool) Get multi-scale prediction.
- """
- def __init__(self, params):
- super(LCOVNet, self).__init__()
- params = self.get_default_parameters(params)
- for p in params:
- print(p, params[p])
- self.stage = 'train'
- # C_in=32, n_classes=17, m=1, is_ds=True):
-
- in_chns = params['in_chns']
- n_class = params['class_num']
- self.ft_chns = params['feature_chns']
- self.mul_pred = params.get('multiscale_pred', False)
-
- self.Encode_block1 = UnetBlock_Encode(in_chns, self.ft_chns[0])
- self.down1 = UnetBlock_Down()
-
- self.Encode_block2 = UnetBlock_Encode(self.ft_chns[0], self.ft_chns[1])
- self.down2 = UnetBlock_Down()
-
- self.Encode_block3 = UnetBlock_Encode(self.ft_chns[1], self.ft_chns[2])
- self.down3 = UnetBlock_Down()
-
- self.Encode_block4 = UnetBlock_Encode(self.ft_chns[2], self.ft_chns[3])
- self.down4 = UnetBlock_Down()
-
- self.Encode_BottleNeck_block5 = UnetBlock_Encode_BottleNeck(
- self.ft_chns[3], self.ft_chns[4])
-
- self.up1 = UnetBlock_Up(self.ft_chns[4], self.ft_chns[3])
- self.Decode_block1 = UnetBlock_Encode(
- self.ft_chns[3]*2, self.ft_chns[3])
- self.segout1 = nn.Conv3d(
- self.ft_chns[3], n_class, kernel_size=1, padding=0)
-
- self.up2 = UnetBlock_Up(self.ft_chns[3], self.ft_chns[2])
- self.Decode_block2 = UnetBlock_Encode(
- self.ft_chns[2]*2, self.ft_chns[2])
- self.segout2 = nn.Conv3d(
- self.ft_chns[2], n_class, kernel_size=1, padding=0)
-
- self.up3 = UnetBlock_Up(self.ft_chns[2], self.ft_chns[1])
- self.Decode_block3 = UnetBlock_Encode(
- self.ft_chns[1]*2, self.ft_chns[1])
- self.segout3 = nn.Conv3d(
- self.ft_chns[1], n_class, kernel_size=1, padding=0)
-
- self.up4 = UnetBlock_Up(self.ft_chns[1], self.ft_chns[0])
- self.Decode_block4 = UnetBlock_Encode(
- self.ft_chns[0]*2, self.ft_chns[0])
- self.segout4 = nn.Conv3d(
- self.ft_chns[0], n_class, kernel_size=1, padding=0)
-
- def get_default_parameters(self, params):
- default_param = {
- 'feature_chns': [32, 64, 128, 256, 512],
- 'initialization': 'he',
- 'multiscale_pred': False
- }
- for key in default_param:
- params[key] = params.get(key, default_param[key])
- for key in params:
- logging.info("{0:} = {1:}".format(key, params[key]))
- return params
-
- def forward(self, x):
- _x1 = self.Encode_block1(x)
- x1 = self.down1(_x1)
-
- _x2 = self.Encode_block2(x1)
- x2 = self.down2(_x2)
-
- _x3 = self.Encode_block3(x2)
- x3 = self.down2(_x3)
-
- _x4 = self.Encode_block4(x3)
- x4 = self.down2(_x4)
-
- x5 = self.Encode_BottleNeck_block5(x4)
-
- x6 = self.up1(x5)
- x6 = torch.cat((x6, _x4), dim=1)
- x6 = self.Decode_block1(x6)
- segout1 = self.segout1(x6)
-
- x7 = self.up2(x6)
- x7 = torch.cat((x7, _x3), dim=1)
- x7 = self.Decode_block2(x7)
- segout2 = self.segout2(x7)
-
- x8 = self.up3(x7)
- x8 = torch.cat((x8, _x2), dim=1)
- x8 = self.Decode_block3(x8)
- segout3 = self.segout3(x8)
-
- x9 = self.up4(x8)
- x9 = torch.cat((x9, _x1), dim=1)
- x9 = self.Decode_block4(x9)
- segout4 = self.segout4(x9)
-
- if (self.mul_pred == True and self.stage == 'train'):
- return [segout4, segout3, segout2, segout1]
- else:
- return segout4
\ No newline at end of file
diff --git a/pymic/net/net3d/scse3d.py b/pymic/net/net3d/scse3d.py
deleted file mode 100644
index df67689..0000000
--- a/pymic/net/net3d/scse3d.py
+++ /dev/null
@@ -1,130 +0,0 @@
-"""
-3D implementation of: \n
-1. Channel Squeeze and Excitation \n
-2. Spatial Squeeze and Excitation \n
-3. Concurrent Spatial and Channel Squeeze & Excitation
-
-Oringinal file is on `Github.
-`_
-"""
-from __future__ import print_function, division
-
-from enum import Enum
-import torch
-import torch.nn as nn
-import torch.nn.functional as F
-
-class ChannelSELayer3D(nn.Module):
- """
- 3D implementation of Squeeze-and-Excitation (SE) block.
-
- * Reference: Jie Hu, Li Shen, Gang Sun: Squeeze-and-Excitation Networks.
- `CVPR 2018. `_
-
- :param num_channels: Number of input channels
- :param reduction_ratio: By how much should the num_channels should be reduced
- """
- def __init__(self, num_channels, reduction_ratio=2):
- super(ChannelSELayer3D, self).__init__()
- num_channels_reduced = num_channels // reduction_ratio
- self.reduction_ratio = reduction_ratio
- self.fc1 = nn.Linear(num_channels, num_channels_reduced, bias=True)
- self.fc2 = nn.Linear(num_channels_reduced, num_channels, bias=True)
- self.relu = nn.ReLU()
- self.sigmoid = nn.Sigmoid()
-
- def forward(self, input_tensor):
- """
- :param input_tensor: X, shape = (batch_size, num_channels, D, H, W)
- :return: output tensor
- """
-
- batch_size, num_channels, D, H, W = input_tensor.size()
- # Average along each channel
- squeeze_tensor = input_tensor.view(batch_size, num_channels, -1).mean(dim=2)
- # channel excitation
- fc_out_1 = self.relu(self.fc1(squeeze_tensor))
- fc_out_2 = self.sigmoid(self.fc2(fc_out_1))
-
- a, b = squeeze_tensor.size()
- output_tensor = torch.mul(input_tensor, fc_out_2.view(a, b, 1, 1, 1))
-
- return output_tensor
-
-class SpatialSELayer3D(nn.Module):
- """
- 3D Re-implementation of SE block -- squeezing spatially and exciting channel-wise described in:
-
- * Reference: Roy et al., Concurrent Spatial and Channel Squeeze & Excitation in
- Fully Convolutional Networks, MICCAI 2018.
-
- :param num_channels: Number of input channels
- """
- def __init__(self, num_channels):
- super(SpatialSELayer3D, self).__init__()
- self.conv = nn.Conv3d(num_channels, 1, 1)
- self.sigmoid = nn.Sigmoid()
-
- def forward(self, input_tensor, weights=None):
- """
- :param weights: weights for few shot learning
- :param input_tensor: X, shape = (batch_size, num_channels, D, H, W)
- :return: output_tensor
- """
- # spatial squeeze
- batch_size, channel, D, H, W = input_tensor.size()
- if weights is not None:
- weights = torch.mean(weights, dim=0)
- weights = weights.view(1, channel, 1, 1)
- out = F.conv3d(input_tensor, weights)
- else:
- out = self.conv(input_tensor)
- squeeze_tensor = self.sigmoid(out)
-
- # spatial excitation
- # print(input_tensor.size(), squeeze_tensor.size())
- squeeze_tensor = squeeze_tensor.view(batch_size, 1, D, H, W)
- output_tensor = torch.mul(input_tensor, squeeze_tensor)
-
- #output_tensor = torch.mul(input_tensor, squeeze_tensor)
- return output_tensor
-
-
-class ChannelSpatialSELayer3D(nn.Module):
- """
- 3D Re-implementation of concurrent spatial and channel squeeze & excitation.
-
- * Reference: Roy et al., Concurrent Spatial and Channel Squeeze & Excitation in
- Fully Convolutional Networks, MICCAI 2018.
-
- :param num_channels: Number of input channels
- :param reduction_ratio: By how much should the num_channels should be reduced
- """
- def __init__(self, num_channels, reduction_ratio=2):
- super(ChannelSpatialSELayer3D, self).__init__()
- self.cSE = ChannelSELayer3D(num_channels, reduction_ratio)
- self.sSE = SpatialSELayer3D(num_channels)
-
- def forward(self, input_tensor):
- """
- :param input_tensor: X, shape = (batch_size, num_channels, D, H, W)
- :return: output_tensor
- """
- output_tensor = torch.max(self.cSE(input_tensor), self.sSE(input_tensor))
- return output_tensor
-
-class SELayer(Enum):
- """
- Enum restricting the type of SE Blockes available. So that type checking can be adding when adding these blockes to
- a neural network::
- if self.se_block_type == se.SELayer.CSE.value:
- self.SELayer = se.ChannelSpatialSELayer(params['num_filters'])
- elif self.se_block_type == se.SELayer.SSE.value:
- self.SELayer = se.SpatialSELayer(params['num_filters'])
- elif self.se_block_type == se.SELayer.CSSE.value:
- self.SELayer = se.ChannelSpatialSELayer(params['num_filters'])
- """
- NONE = 'NONE'
- CSE = 'CSE'
- SSE = 'SSE'
- CSSE = 'CSSE'
\ No newline at end of file
diff --git a/pymic/net/net3d/trans3d/__init__.py b/pymic/net/net3d/trans3d/__init__.py
deleted file mode 100644
index e69de29..0000000
diff --git a/pymic/net/net3d/trans3d/transunet3d.py b/pymic/net/net3d/trans3d/transunet3d.py
deleted file mode 100644
index 183834e..0000000
--- a/pymic/net/net3d/trans3d/transunet3d.py
+++ /dev/null
@@ -1,1053 +0,0 @@
-# 3D version of TransUNet; Copyright Johns Hopkins University
-# Modified from nnUNet
-
-
-
-import torch
-import numpy as np
-import torch.nn.functional
-import torch.nn.functional as F
-
-from copy import deepcopy
-from torch import nn
-from torch.cuda.amp import autocast
-from scipy.optimize import linear_sum_assignment
-
-from ..networks.neural_network import SegmentationNetwork
-from .vit_modeling import Transformer
-from .vit_modeling import CONFIGS as CONFIGS_ViT
-
-softmax_helper = lambda x: F.softmax(x, 1)
-
-class InitWeights_He(object):
- def __init__(self, neg_slope=1e-2):
- self.neg_slope = neg_slope
-
- def __call__(self, module):
- if isinstance(module, nn.Conv3d) or isinstance(module, nn.Conv2d) or isinstance(module, nn.ConvTranspose2d) or isinstance(module, nn.ConvTranspose3d):
- module.weight = nn.init.kaiming_normal_(module.weight, a=self.neg_slope)
- if module.bias is not None:
- module.bias = nn.init.constant_(module.bias, 0)
-
-class ConvDropoutNormNonlin(nn.Module):
- """
- fixes a bug in ConvDropoutNormNonlin where lrelu was used regardless of nonlin. Bad.
- """
-
- def __init__(self, input_channels, output_channels,
- conv_op=nn.Conv2d, conv_kwargs=None,
- norm_op=nn.BatchNorm2d, norm_op_kwargs=None,
- dropout_op=nn.Dropout2d, dropout_op_kwargs=None,
- nonlin=nn.LeakyReLU, nonlin_kwargs=None):
- super(ConvDropoutNormNonlin, self).__init__()
- if nonlin_kwargs is None:
- nonlin_kwargs = {'negative_slope': 1e-2, 'inplace': True}
- if dropout_op_kwargs is None:
- dropout_op_kwargs = {'p': 0.5, 'inplace': True}
- if norm_op_kwargs is None:
- norm_op_kwargs = {'eps': 1e-5, 'affine': True, 'momentum': 0.1}
- if conv_kwargs is None:
- conv_kwargs = {'kernel_size': 3, 'stride': 1, 'padding': 1, 'dilation': 1, 'bias': True}
-
- self.nonlin_kwargs = nonlin_kwargs
- self.nonlin = nonlin
- self.dropout_op = dropout_op
- self.dropout_op_kwargs = dropout_op_kwargs
- self.norm_op_kwargs = norm_op_kwargs
- self.conv_kwargs = conv_kwargs
- self.conv_op = conv_op
- self.norm_op = norm_op
-
- self.conv = self.conv_op(input_channels, output_channels, **self.conv_kwargs)
- if self.dropout_op is not None and self.dropout_op_kwargs['p'] is not None and self.dropout_op_kwargs[
- 'p'] > 0:
- self.dropout = self.dropout_op(**self.dropout_op_kwargs)
- else:
- self.dropout = None
- self.instnorm = self.norm_op(output_channels, **self.norm_op_kwargs)
- self.lrelu = self.nonlin(**self.nonlin_kwargs)
-
- def forward(self, x):
- x = self.conv(x)
- if self.dropout is not None:
- x = self.dropout(x)
- return self.lrelu(self.instnorm(x))
-
-
-class ConvDropoutNonlinNorm(ConvDropoutNormNonlin):
- def forward(self, x):
- x = self.conv(x)
- if self.dropout is not None:
- x = self.dropout(x)
- return self.instnorm(self.lrelu(x))
-
-
-class StackedConvLayers(nn.Module):
- def __init__(self, input_feature_channels, output_feature_channels, num_convs,
- conv_op=nn.Conv2d, conv_kwargs=None,
- norm_op=nn.BatchNorm2d, norm_op_kwargs=None,
- dropout_op=nn.Dropout2d, dropout_op_kwargs=None,
- nonlin=nn.LeakyReLU, nonlin_kwargs=None, first_stride=None, basic_block=ConvDropoutNormNonlin):
- '''
- stacks ConvDropoutNormLReLU layers. initial_stride will only be applied to first layer in the stack. The other parameters affect all layers
- :param input_feature_channels:
- :param output_feature_channels:
- :param num_convs:
- :param dilation:
- :param kernel_size:
- :param padding:
- :param dropout:
- :param initial_stride:
- :param conv_op:
- :param norm_op:
- :param dropout_op:
- :param inplace:
- :param neg_slope:
- :param norm_affine:
- :param conv_bias:
- '''
- self.input_channels = input_feature_channels
- self.output_channels = output_feature_channels
-
- if nonlin_kwargs is None:
- nonlin_kwargs = {'negative_slope': 1e-2, 'inplace': True}
- if dropout_op_kwargs is None:
- dropout_op_kwargs = {'p': 0.5, 'inplace': True}
- if norm_op_kwargs is None:
- norm_op_kwargs = {'eps': 1e-5, 'affine': True, 'momentum': 0.1}
- if conv_kwargs is None:
- conv_kwargs = {'kernel_size': 3, 'stride': 1, 'padding': 1, 'dilation': 1, 'bias': True}
-
- self.nonlin_kwargs = nonlin_kwargs
- self.nonlin = nonlin
- self.dropout_op = dropout_op
- self.dropout_op_kwargs = dropout_op_kwargs
- self.norm_op_kwargs = norm_op_kwargs
- self.conv_kwargs = conv_kwargs
- self.conv_op = conv_op
- self.norm_op = norm_op
-
- if first_stride is not None:
- self.conv_kwargs_first_conv = deepcopy(conv_kwargs)
- self.conv_kwargs_first_conv['stride'] = first_stride
- else:
- self.conv_kwargs_first_conv = conv_kwargs
-
- super(StackedConvLayers, self).__init__()
- self.blocks = nn.Sequential(
- *([basic_block(input_feature_channels, output_feature_channels, self.conv_op,
- self.conv_kwargs_first_conv,
- self.norm_op, self.norm_op_kwargs, self.dropout_op, self.dropout_op_kwargs,
- self.nonlin, self.nonlin_kwargs)] +
- [basic_block(output_feature_channels, output_feature_channels, self.conv_op,
- self.conv_kwargs,
- self.norm_op, self.norm_op_kwargs, self.dropout_op, self.dropout_op_kwargs,
- self.nonlin, self.nonlin_kwargs) for _ in range(num_convs - 1)]))
-
- def forward(self, x):
- return self.blocks(x)
-
-
-def print_module_training_status(module):
- if isinstance(module, nn.Conv2d) or isinstance(module, nn.Conv3d) or isinstance(module, nn.Dropout3d) or \
- isinstance(module, nn.Dropout2d) or isinstance(module, nn.Dropout) or isinstance(module, nn.InstanceNorm3d) \
- or isinstance(module, nn.InstanceNorm2d) or isinstance(module, nn.InstanceNorm1d) \
- or isinstance(module, nn.BatchNorm2d) or isinstance(module, nn.BatchNorm3d) or isinstance(module,
- nn.BatchNorm1d):
- print(str(module), module.training)
-
-
-class Upsample(nn.Module):
- def __init__(self, size=None, scale_factor=None, mode='nearest', align_corners=False):
- super(Upsample, self).__init__()
- self.align_corners = align_corners
- self.mode = mode
- self.scale_factor = scale_factor
- self.size = size
-
- def forward(self, x):
- return nn.functional.interpolate(x, size=self.size, scale_factor=self.scale_factor, mode=self.mode,
- align_corners=self.align_corners)
-
-def c2_xavier_fill(module: nn.Module) -> None:
- """
- Initialize `module.weight` using the "XavierFill" implemented in Caffe2.
- Also initializes `module.bias` to 0.
- Args:
- module (torch.nn.Module): module to initialize.
- """
- # Caffe2 implementation of XavierFill in fact
- # corresponds to kaiming_uniform_ in PyTorch
- nn.init.kaiming_uniform_(module.weight, a=1)
- if module.bias is not None:
- # pyre-fixme[6]: Expected `Tensor` for 1st param but got `Union[nn.Module,
- # torch.Tensor]`.
- nn.init.constant_(module.bias, 0)
-
-class Generic_TransUNet_max_ppbp(SegmentationNetwork):
- DEFAULT_BATCH_SIZE_3D = 2
- DEFAULT_PATCH_SIZE_3D = (64, 192, 160)
- SPACING_FACTOR_BETWEEN_STAGES = 2
- BASE_NUM_FEATURES_3D = 30
- MAX_NUMPOOL_3D = 999
- MAX_NUM_FILTERS_3D = 320
-
- DEFAULT_PATCH_SIZE_2D = (256, 256)
- BASE_NUM_FEATURES_2D = 30
- DEFAULT_BATCH_SIZE_2D = 50
- MAX_NUMPOOL_2D = 999
- MAX_FILTERS_2D = 480
-
- use_this_for_batch_size_computation_2D = 19739648
- use_this_for_batch_size_computation_3D = 520000000 # 505789440
-
- def __init__(self, input_channels, base_num_features, num_classes, num_pool, num_conv_per_stage=2,
- feat_map_mul_on_downscale=2, conv_op=nn.Conv2d,
- norm_op=nn.BatchNorm2d, norm_op_kwargs=None,
- dropout_op=nn.Dropout2d, dropout_op_kwargs=None,
- nonlin=nn.LeakyReLU, nonlin_kwargs=None, deep_supervision=True, dropout_in_localization=False,
- final_nonlin=softmax_helper, weightInitializer=InitWeights_He(1e-2), pool_op_kernel_sizes=None,
- conv_kernel_sizes=None,
- upscale_logits=False, convolutional_pooling=False, convolutional_upsampling=False, # TODO default False
- max_num_features=None, basic_block=ConvDropoutNormNonlin,
- seg_output_use_bias=False,
- patch_size=None, is_vit_pretrain=False,
- vit_depth=12, vit_hidden_size=768, vit_mlp_dim=3072, vit_num_heads=12,
- max_msda='', is_max_ms=True, is_max_ms_fpn=False, max_n_fpn=4, max_ms_idxs=[-4,-3,-2], max_ss_idx=0,
- is_max_bottleneck_transformer=False, max_seg_weight=1.0, max_hidden_dim=256, max_dec_layers=10,
- mw = 0.5,
- is_max=True, is_masked_attn=False, is_max_ds=False, is_masking=False, is_masking_argmax=False,
- is_fam=False, fam_k=5, fam_reduct_ratio=8,
- is_max_hungarian=False, num_queries=None, is_max_cls=False,
- point_rend=False, num_point_rend=None, no_object_weight=None, is_mhsa_float32=False, no_max_hw_pe=False,
- max_infer=None, cost_weight=[2.0, 5.0, 5.0], vit_layer_scale=False, decoder_layer_scale=False):
-
- super(Generic_TransUNet_max_ppbp, self).__init__()
-
- # newly added
- self.is_fam = is_fam
- self.is_max, self.max_msda, self.is_max_ms, self.is_max_ms_fpn, self.max_n_fpn, self.max_ss_idx, self.mw = is_max, max_msda, is_max_ms, is_max_ms_fpn, max_n_fpn, max_ss_idx, mw
- self.max_ms_idxs = max_ms_idxs
-
- self.is_max_cls = is_max_cls
- self.is_masked_attn, self.is_max_ds = is_masked_attn, is_max_ds
- self.is_max_bottleneck_transformer = is_max_bottleneck_transformer
-
- self.convolutional_upsampling = convolutional_upsampling
- self.convolutional_pooling = convolutional_pooling
- self.upscale_logits = upscale_logits
- if nonlin_kwargs is None:
- nonlin_kwargs = {'negative_slope': 1e-2, 'inplace': True}
- if dropout_op_kwargs is None:
- dropout_op_kwargs = {'p': 0.5, 'inplace': True}
- if norm_op_kwargs is None:
- norm_op_kwargs = {'eps': 1e-5, 'affine': True, 'momentum': 0.1}
-
- self.conv_kwargs = {'stride': 1, 'dilation': 1, 'bias': True}
-
- self.nonlin = nonlin
- self.nonlin_kwargs = nonlin_kwargs
- self.dropout_op_kwargs = dropout_op_kwargs
- self.norm_op_kwargs = norm_op_kwargs
- self.weightInitializer = weightInitializer
- self.conv_op = conv_op
- self.norm_op = norm_op
- self.dropout_op = dropout_op
- self.num_classes = num_classes
- self.final_nonlin = final_nonlin
- self._deep_supervision = deep_supervision
- self.do_ds = deep_supervision
-
- if conv_op == nn.Conv2d:
- upsample_mode = 'bilinear'
- pool_op = nn.MaxPool2d
- transpconv = nn.ConvTranspose2d
- if pool_op_kernel_sizes is None:
- pool_op_kernel_sizes = [(2, 2)] * num_pool
- if conv_kernel_sizes is None:
- conv_kernel_sizes = [(3, 3)] * (num_pool + 1)
- elif conv_op == nn.Conv3d:
- upsample_mode = 'trilinear'
- pool_op = nn.MaxPool3d
- transpconv = nn.ConvTranspose3d
- if pool_op_kernel_sizes is None:
- pool_op_kernel_sizes = [(2, 2, 2)] * num_pool
- if conv_kernel_sizes is None:
- conv_kernel_sizes = [(3, 3, 3)] * (num_pool + 1)
- else:
- raise ValueError("unknown convolution dimensionality, conv op: %s" % str(conv_op))
-
- self.input_shape_must_be_divisible_by = np.prod(pool_op_kernel_sizes, 0, dtype=np.int64)
- self.pool_op_kernel_sizes = pool_op_kernel_sizes
- self.conv_kernel_sizes = conv_kernel_sizes
-
- self.conv_pad_sizes = []
- for krnl in self.conv_kernel_sizes:
- self.conv_pad_sizes.append([1 if i == 3 else 0 for i in krnl])
-
- if max_num_features is None:
- if self.conv_op == nn.Conv3d:
- self.max_num_features = self.MAX_NUM_FILTERS_3D
- else:
- self.max_num_features = self.MAX_FILTERS_2D
- else:
- self.max_num_features = max_num_features
-
- self.conv_blocks_context = []
- self.conv_blocks_localization = []
- self.td = []
- self.tu = []
-
-
- self.fams = []
-
- output_features = base_num_features
- input_features = input_channels
-
- for d in range(num_pool):
- # determine the first stride
- if d != 0 and self.convolutional_pooling:
- first_stride = pool_op_kernel_sizes[d - 1]
- else:
- first_stride = None
-
- self.conv_kwargs['kernel_size'] = self.conv_kernel_sizes[d]
- self.conv_kwargs['padding'] = self.conv_pad_sizes[d]
- # add convolutions
- self.conv_blocks_context.append(StackedConvLayers(input_features, output_features, num_conv_per_stage,
- self.conv_op, self.conv_kwargs, self.norm_op,
- self.norm_op_kwargs, self.dropout_op,
- self.dropout_op_kwargs, self.nonlin, self.nonlin_kwargs,
- first_stride, basic_block=basic_block))
- if not self.convolutional_pooling:
- self.td.append(pool_op(pool_op_kernel_sizes[d]))
- input_features = output_features
- output_features = int(np.round(output_features * feat_map_mul_on_downscale))
-
- output_features = min(output_features, self.max_num_features)
-
- # now the bottleneck.
- # determine the first stride
- if self.convolutional_pooling:
- first_stride = pool_op_kernel_sizes[-1]
- else:
- first_stride = None
-
- # the output of the last conv must match the number of features from the skip connection if we are not using
- # convolutional upsampling. If we use convolutional upsampling then the reduction in feature maps will be
- # done by the transposed conv
- if self.convolutional_upsampling:
- final_num_features = output_features
- else:
- final_num_features = self.conv_blocks_context[-1].output_channels
-
- self.conv_kwargs['kernel_size'] = self.conv_kernel_sizes[num_pool]
- self.conv_kwargs['padding'] = self.conv_pad_sizes[num_pool]
- self.conv_blocks_context.append(nn.Sequential(
- StackedConvLayers(input_features, output_features, num_conv_per_stage - 1, self.conv_op, self.conv_kwargs,
- self.norm_op, self.norm_op_kwargs, self.dropout_op, self.dropout_op_kwargs, self.nonlin,
- self.nonlin_kwargs, first_stride, basic_block=basic_block),
- StackedConvLayers(output_features, final_num_features, 1, self.conv_op, self.conv_kwargs,
- self.norm_op, self.norm_op_kwargs, self.dropout_op, self.dropout_op_kwargs, self.nonlin,
- self.nonlin_kwargs, basic_block=basic_block)))
-
- # if we don't want to do dropout in the localization pathway then we set the dropout prob to zero here
- if not dropout_in_localization:
- old_dropout_p = self.dropout_op_kwargs['p']
- self.dropout_op_kwargs['p'] = 0.0
-
- # now lets build the localization pathway
- for u in range(num_pool):
- nfeatures_from_down = final_num_features
- nfeatures_from_skip = self.conv_blocks_context[
- -(2 + u)].output_channels # self.conv_blocks_context[-1] is bottleneck, so start with -2
- n_features_after_tu_and_concat = nfeatures_from_skip * 2
-
- # the first conv reduces the number of features to match those of skip
- # the following convs work on that number of features
- # if not convolutional upsampling then the final conv reduces the num of features again
- if u != num_pool - 1 and not self.convolutional_upsampling:
- final_num_features = self.conv_blocks_context[-(3 + u)].output_channels
- else:
- final_num_features = nfeatures_from_skip
-
- if not self.convolutional_upsampling:
- self.tu.append(Upsample(scale_factor=pool_op_kernel_sizes[-(u + 1)], mode=upsample_mode))
- else:
- self.tu.append(transpconv(nfeatures_from_down, nfeatures_from_skip, pool_op_kernel_sizes[-(u + 1)],
- pool_op_kernel_sizes[-(u + 1)], bias=False))
-
- self.conv_kwargs['kernel_size'] = self.conv_kernel_sizes[- (u + 1)]
- self.conv_kwargs['padding'] = self.conv_pad_sizes[- (u + 1)]
- self.conv_blocks_localization.append(nn.Sequential(
- StackedConvLayers(n_features_after_tu_and_concat, nfeatures_from_skip, num_conv_per_stage - 1,
- self.conv_op, self.conv_kwargs, self.norm_op, self.norm_op_kwargs, self.dropout_op,
- self.dropout_op_kwargs, self.nonlin, self.nonlin_kwargs, basic_block=basic_block),
- StackedConvLayers(nfeatures_from_skip, final_num_features, 1, self.conv_op, self.conv_kwargs,
- self.norm_op, self.norm_op_kwargs, self.dropout_op, self.dropout_op_kwargs,
- self.nonlin, self.nonlin_kwargs, basic_block=basic_block)
- ))
-
-
-
- if self.is_fam:
- self.fams = nn.ModuleList(self.fams)
-
- if self.do_ds:
- self.seg_outputs = []
- for ds in range(len(self.conv_blocks_localization)):
- self.seg_outputs.append(conv_op(self.conv_blocks_localization[ds][-1].output_channels, num_classes,
- 1, 1, 0, 1, 1, seg_output_use_bias))
- self.seg_outputs = nn.ModuleList(self.seg_outputs)
-
- self.upscale_logits_ops = []
- cum_upsample = np.cumprod(np.vstack(pool_op_kernel_sizes), axis=0)[::-1]
- for usl in range(num_pool - 1):
- if self.upscale_logits:
- self.upscale_logits_ops.append(Upsample(scale_factor=tuple([int(i) for i in cum_upsample[usl + 1]]),
- mode=upsample_mode))
- else:
- self.upscale_logits_ops.append(lambda x: x)
-
- if not dropout_in_localization:
- self.dropout_op_kwargs['p'] = old_dropout_p
-
- # register all modules properly
- self.conv_blocks_localization = nn.ModuleList(self.conv_blocks_localization)
- self.conv_blocks_context = nn.ModuleList(self.conv_blocks_context)
- self.td = nn.ModuleList(self.td)
- self.tu = nn.ModuleList(self.tu)
-
- if self.upscale_logits:
- self.upscale_logits_ops = nn.ModuleList(
- self.upscale_logits_ops) # lambda x:x is not a Module so we need to distinguish here
-
- if self.weightInitializer is not None:
- self.apply(self.weightInitializer)
- # self.apply(print_module_training_status)
-
- # Transformer configuration
- if self.is_max_bottleneck_transformer:
- self.patch_size = patch_size # e.g. [48, 192, 192]
- config_vit = CONFIGS_ViT['R50-ViT-B_16']
- config_vit.transformer.num_layers = vit_depth
- config_vit.hidden_size = vit_hidden_size # 768
- config_vit.transformer.mlp_dim = vit_mlp_dim # 3072
- config_vit.transformer.num_heads = vit_num_heads # 12
- self.conv_more = nn.Conv3d(config_vit.hidden_size, output_features, 1)
- num_pool_per_axis = np.prod(np.array(pool_op_kernel_sizes), axis=0)
- num_pool_per_axis = np.log2(num_pool_per_axis).astype(np.uint8)
- feat_size = [int(self.patch_size[0]/2**num_pool_per_axis[0]), int(self.patch_size[1]/2**num_pool_per_axis[1]), int(self.patch_size[2]/2**num_pool_per_axis[2])]
- self.transformer = Transformer(config_vit, feat_size=feat_size, vis=False, feat_channels=output_features, use_layer_scale=vit_layer_scale)
- if is_vit_pretrain:
- self.transformer.load_from(weights=np.load(config_vit.pretrained_path))
-
-
- if self.is_max:
- # Max PPB+ configuration (i.e. MultiScaleStandardTransformerDecoder)
- cfg = {
- "num_classes": num_classes,
- "hidden_dim": max_hidden_dim,
- "num_queries": num_classes if num_queries is None else num_queries, # N=K if 'fixed matching', else default=100,
- "nheads": 8,
- "dim_feedforward": max_hidden_dim * 8, # 2048,
- "dec_layers": max_dec_layers, # 9 decoder layers, add one for the loss on learnable query?
- "pre_norm": False,
- "enforce_input_project": False,
- "mask_dim": max_hidden_dim, # input feat of segm head?
- "non_object": False,
- "use_layer_scale": decoder_layer_scale,
- }
- cfg['non_object'] = is_max_cls
- input_proj_list = [] # from low resolution to high resolution (res4 -> res1), [1, 1024, 14, 14], [1, 512, 28, 28], 1, 256, 56, 56], [1, 64, 112, 112]
- decoder_channels = [320, 320, 256, 128, 64, 32]
- if self.is_max_ms: # use multi-scale feature as Transformer decoder input
- if self.is_max_ms_fpn:
- for idx, in_channels in enumerate(decoder_channels[:max_n_fpn]): # max_n_fpn=4: 1/32, 1/16, 1/8, 1/4
- input_proj_list.append(nn.Sequential(
- nn.Conv3d(in_channels, max_hidden_dim, kernel_size=1),
- nn.GroupNorm(32, max_hidden_dim),
- nn.Upsample(size=(int(patch_size[0]/2), int(patch_size[1]/4), int(patch_size[2]/4)), mode='trilinear')
- )) # proj to scale (1, 1/2, 1/2), TODO: init
- self.input_proj = nn.ModuleList(input_proj_list)
- self.linear_encoder_feature = nn.Conv3d(max_hidden_dim * max_n_fpn, max_hidden_dim, 1, 1) # concat four-level feature
- else:
- for idx, in_channels in enumerate([decoder_channels[i] for i in self.max_ms_idxs]):
- input_proj_list.append(nn.Sequential(
- nn.Conv3d(in_channels, max_hidden_dim, kernel_size=1),
- nn.GroupNorm(32, max_hidden_dim),
- ))
- self.input_proj = nn.ModuleList(input_proj_list)
-
- # self.linear_mask_features =nn.Conv3d(decoder_channels[max_n_fpn-1], cfg["mask_dim"], kernel_size=1, stride=1, padding=0,) # low-level feat, dot product Trans-feat
- self.linear_mask_features =nn.Conv3d(decoder_channels[-1], cfg["mask_dim"], kernel_size=1, stride=1, padding=0,) # following SingleScale, high-level feat, obtain seg_map
- else:
- self.linear_encoder_feature = nn.Conv3d(decoder_channels[max_ss_idx], cfg["mask_dim"], kernel_size=1)
- self.linear_mask_features = nn.Conv3d(decoder_channels[-1], cfg["mask_dim"], kernel_size=1, stride=1, padding=0,) # low-level feat, dot product Trans-feat
-
- if self.is_masked_attn:
- from .mask2former_modeling.transformer_decoder.mask2former_transformer_decoder3d import MultiScaleMaskedTransformerDecoder3d
- cfg['num_feature_levels'] = 1 if not self.is_max_ms or self.is_max_ms_fpn else 3
- cfg["is_masking"] = True if is_masking else False
- cfg["is_masking_argmax"] = True if is_masking_argmax else False
- cfg["is_mhsa_float32"] = True if is_mhsa_float32 else False
- cfg["no_max_hw_pe"] = True if no_max_hw_pe else False
- self.predictor = MultiScaleMaskedTransformerDecoder3d(in_channels=max_hidden_dim, mask_classification=is_max_cls, **cfg)
- else:
- from .mask2former_modeling.transformer_decoder.maskformer_transformer_decoder3d import StandardTransformerDecoder
- cfg["dropout"], cfg["enc_layers"], cfg["deep_supervision"] = 0.1, 0, False
- self.predictor = StandardTransformerDecoder(in_channels=max_hidden_dim, mask_classification=is_max_cls, **cfg)
-
- def forward(self, x):
- skips = []
- seg_outputs = []
- for d in range(len(self.conv_blocks_context) - 1):
- x = self.conv_blocks_context[d](x)
- skips.append(x)
- if not self.convolutional_pooling:
- x = self.td[d](x)
-
- x = self.conv_blocks_context[-1](x)
- ######### TransUNet #########
- if self.is_max_bottleneck_transformer:
- x, attn = self.transformer(x) # [b, hidden, d/8, h/16, w/16]
- x = self.conv_more(x)
- #############################
-
- ds_feats = [] # obtain multi-scale feature
- ds_feats.append(x)
- for u in range(len(self.tu)):
- if unm", inputs, targets)
- denominator = inputs.sum(-1)[:, None] + targets.sum(-1)[None, :]
- loss = 1 - (numerator + 1) / (denominator + 1)
- return loss
-
-
-batch_dice_loss_jit = torch.jit.script(
- batch_dice_loss
-) # type: torch.jit.ScriptModule
-
-
-
-def batch_sigmoid_ce_loss(inputs: torch.Tensor, targets: torch.Tensor):
- """
- Args:
- inputs: A float tensor of arbitrary shape.
- The predictions for each example.
- targets: A float tensor with the same shape as inputs. Stores the binary
- classification label for each element in inputs
- (0 for the negative class and 1 for the positive class).
- Returns:
- Loss tensor
- """
- hw = inputs.shape[1]
-
- pos = F.binary_cross_entropy_with_logits(
- inputs, torch.ones_like(inputs), reduction="none"
- )
- neg = F.binary_cross_entropy_with_logits(
- inputs, torch.zeros_like(inputs), reduction="none"
- )
-
- loss = torch.einsum("nc,mc->nm", pos, targets) + torch.einsum(
- "nc,mc->nm", neg, (1 - targets)
- )
-
- return loss / hw
-
-
-batch_sigmoid_ce_loss_jit = torch.jit.script(
- batch_sigmoid_ce_loss
-) # type: torch.jit.ScriptModule
-
-
-class HungarianMatcher3D(nn.Module):
- """This class computes an assignment between the targets and the predictions of the network
-
- For efficiency reasons, the targets don't include the no_object. Because of this, in general,
- there are more predictions than targets. In this case, we do a 1-to-1 matching of the best predictions,
- while the others are un-matched (and thus treated as non-objects).
- """
-
- def __init__(self, cost_class: float = 1, cost_mask: float = 1, cost_dice: float = 1, ):
- """Creates the matcher
-
- Params:
- cost_class: This is the relative weight of the classification error in the matching cost
- cost_mask: This is the relative weight of the focal loss of the binary mask in the matching cost
- cost_dice: This is the relative weight of the dice loss of the binary mask in the matching cost
- """
- super().__init__()
- self.cost_class = cost_class
- self.cost_mask = cost_mask
- self.cost_dice = cost_dice
-
- def compute_cls_loss(self, inputs, targets):
- """ Classification loss (NLL)
- implemented in compute_loss()
- """
- raise NotImplementedError
-
-
- def compute_dice_loss(self, inputs, targets):
- """ mask dice loss
- inputs (B*K, C, H, W)
- target (B*K, D, H, W)
- """
- inputs = inputs.sigmoid()
- inputs = inputs.flatten(1)
- targets = targets.flatten(1)
- num_masks = len(inputs)
-
- numerator = 2 * (inputs * targets).sum(-1)
- denominator = inputs.sum(-1) + targets.sum(-1)
- loss = 1 - (numerator + 1) / (denominator + 1)
- return loss.sum() / num_masks
-
-
- def compute_ce_loss(self, inputs, targets):
- """mask ce loss"""
- num_masks = len(inputs)
- loss = F.binary_cross_entropy_with_logits(inputs.flatten(1), targets.flatten(1), reduction="none")
- loss = loss.mean(1).sum() / num_masks
- return loss
-
- def compute_dice(self, inputs, targets):
- """ output (N_q, C, H, W)
- target (K, D, H, W)
- """
- inputs = inputs.sigmoid()
- inputs = inputs.flatten(1)
- targets = targets.flatten(1)
- numerator = 2 * torch.einsum("nc,mc->nm", inputs, targets)
- denominator = inputs.sum(-1)[:, None] + targets.sum(-1)[None, :]
- loss = 1 - (numerator + 1) / (denominator + 1)
- return loss # [N_q, K]
-
-
- def compute_ce(self, inputs, targets):
- """ output (N_q, C, H, W)
- target (K, D, H, W)
- return (N_q, K)
- """
- inputs = inputs.flatten(1)
- targets = targets.flatten(1)
- hw = inputs.shape[1]
-
- pos = F.binary_cross_entropy_with_logits(
- inputs, torch.ones_like(inputs), reduction="none"
- )
-
- neg = F.binary_cross_entropy_with_logits(
- inputs, torch.zeros_like(inputs), reduction="none"
- )
-
- loss = torch.einsum("nc,mc->nm", pos, targets) + torch.einsum(
- "nc,mc->nm", neg, (1 - targets)
- )
-
- return loss / hw
-
- # target_onehot = torch.zeros_like(output, device=output.device)
- # target_onehot.scatter_(1, target.long(), 1)
- # assert (torch.argmax(target_onehot, dim=1) == target[:, 0].long()).all()
- # ce_loss = F.binary_cross_entropy_with_logits(output, target_onehot)
- # return ce_loss
-
-
- @torch.no_grad()
- def memory_efficient_forward(self, outputs, targets):
- """More memory-friendly matching for single aux, outputs: (b, q, d, h, w)"""
- """suppose each crop must contain foreground class"""
- bs, num_queries = outputs["pred_logits"].shape[:2]
- indices = []
-
- # Iterate through batch size
- for b in range(bs):
- out_prob = outputs["pred_logits"][b].softmax(-1) # [num_queries, num_classes+1]
- out_mask = outputs["pred_masks"][b] # [num_queries, H_pred, W_pred]
-
- tgt_ids = targets[b]["labels"]
- tgt_mask = targets[b]["masks"].to(out_mask) # [K, D, H, W], K is number of classes shown in this image, and K < n_class
-
- # target_onehot = torch.zeros_like(tgt_mask, device=out_mask.device)
- # target_onehot.scatter_(1, targets.long(), 1)
-
- cost_class = -out_prob[:, tgt_ids] # [num_queries, K]
-
- with autocast(enabled=False):
- out_mask = out_mask.float()
- tgt_mask = tgt_mask.float()
- cost_dice = self.compute_dice(out_mask, tgt_mask)
- cost_mask = self.compute_ce(out_mask, tgt_mask)
-
- # Final cost matrix
- C = (
- self.cost_class * cost_class
- + self.cost_mask * cost_mask
- + self.cost_dice * cost_dice
- )
-
- C = C.reshape(num_queries, -1).cpu() # (num_queries, K)
-
- # linear_sum_assignment return a tuple of two arrays: row_ind, col_ind, the length of array is min(N_q, K)
- # The cost of the assignment can be computed as cost_matrix[row_ind, col_ind].sum()
-
- indices.append(linear_sum_assignment(C))
-
- final_indices = [
- (torch.as_tensor(i, dtype=torch.int64), torch.as_tensor(j, dtype=torch.int64))
- for i, j in indices
- ]
-
- return final_indices
-
- @torch.no_grad()
- def forward(self, outputs, targets):
- """Performs the matching
-
- Params:
- outputs: This is a dict that contains at least these entries:
- "pred_logits": Tensor of dim [batch_size, num_queries, num_classes] with the classification logits
- "pred_masks": Tensor of dim [batch_size, num_queries, H_pred, W_pred] with the predicted masks
-
- targets: This is a list of targets (len(targets) = batch_size), where each target is a dict containing:
- "labels": Tensor of dim [num_target_boxes] (where num_target_boxes is the number of ground-truth
- objects in the target) containing the class labels
- "masks": Tensor of dim [num_target_boxes, H_gt, W_gt] containing the target masks
-
- Returns:
- A list of size batch_size, containing tuples of (index_i, index_j) where:
- - index_i is the indices of the selected predictions (in order)
- - index_j is the indices of the corresponding selected targets (in order)
- For each batch element, it holds:
- len(index_i) = len(index_j) = min(num_queries, num_target_boxes)
- """
-
- return self.memory_efficient_forward(outputs, targets)
-
- def __repr__(self, _repr_indent=4):
- head = "Matcher " + self.__class__.__name__
- body = [
- "cost_class: {}".format(self.cost_class),
- "cost_mask: {}".format(self.cost_mask),
- "cost_dice: {}".format(self.cost_dice),
- ]
- lines = [head] + [" " * _repr_indent + line for line in body]
- return "\n".join(lines)
-
-
- def _get_src_permutation_idx(self, indices):
- # permute predictions following indices
- batch_idx = torch.cat([torch.full_like(src, i) for i, (src, _) in enumerate(indices)])
- src_idx = torch.cat([src for (src, _) in indices])
- return batch_idx, src_idx
-
- def _get_tgt_permutation_idx(self, indices):
- # permute targets following indices
- batch_idx = torch.cat([torch.full_like(tgt, i) for i, (_, tgt) in enumerate(indices)])
- tgt_idx = torch.cat([tgt for (_, tgt) in indices])
- return batch_idx, tgt_idx
-
-
-def compute_loss_hungarian(outputs, targets, idx, matcher, num_classes, point_rend=False, num_points=12544, oversample_ratio=3.0, importance_sample_ratio=0.75, no_object_weight=None, cost_weight=[2,5,5]):
- """output is a dict only contain keys ['pred_masks', 'pred_logits'] """
- # outputs_without_aux = {k: v for k, v in output.items() if k != "aux_outputs"}
-
- indices = matcher(outputs, targets)
- src_idx = matcher._get_src_permutation_idx(indices) # return a tuple of (batch_idx, src_idx)
- tgt_idx = matcher._get_tgt_permutation_idx(indices) # return a tuple of (batch_idx, tgt_idx)
- assert len(tgt_idx[0]) == sum([len(t["masks"]) for t in targets]) # verify that all masks of (K1, K2, ..) are used
-
- # step2 : compute mask loss
- src_masks = outputs["pred_masks"]
- src_masks = src_masks[src_idx] # [len(src_idx[0]), D, H, W] -> (K1+K2+..., D, H, W)
- target_masks = torch.cat([t["masks"] for t in targets], dim=0) # (K1+K2+..., D, H, W) actually
- src_masks = src_masks[:, None] # [K..., 1, D, H, W]
- target_masks = target_masks[:, None]
-
- if point_rend: # only calculate hard example
- with torch.no_grad():
- # num_points=12544 config in cityscapes
-
- # sample point_coords
- point_coords = get_uncertain_point_coords_with_randomness(
- src_masks.float(),
- lambda logits: calculate_uncertainty(logits),
- num_points,
- oversample_ratio,
- importance_sample_ratio,
- ) # [K, num_points=12544, 3]
-
- point_labels = point_sample_3d(
- target_masks.float(),
- point_coords.float(),
- align_corners=False,
- ).squeeze(1) # [K, 12544]
-
- point_logits = point_sample_3d(
- src_masks.float(),
- point_coords.float(),
- align_corners=False,
- ).squeeze(1) # [K, 12544]
-
- src_masks, target_masks = point_logits, point_labels
-
- loss_mask_ce = matcher.compute_ce_loss(src_masks, target_masks)
- loss_mask_dice = matcher.compute_dice_loss(src_masks, target_masks)
-
- # step3: compute class loss
- src_logits = outputs["pred_logits"].float() # (B, num_query, num_class+1)
- target_classes_o = torch.cat([t["labels"] for t in targets], dim=0) # (K1+K2+, )
- target_classes = torch.full(
- src_logits.shape[:2], num_classes, dtype=torch.int64, device=src_logits.device
- ) # (B, num_query, num_class+1)
- target_classes[src_idx] = target_classes_o
-
-
- if no_object_weight is not None:
- empty_weight = torch.ones(num_classes + 1).to(src_logits.device)
- empty_weight[-1] = no_object_weight
- loss_cls = F.cross_entropy(src_logits.transpose(1, 2), target_classes, empty_weight)
- else:
- loss_cls = F.cross_entropy(src_logits.transpose(1, 2), target_classes)
-
- loss = (cost_weight[0]/10)*loss_cls + (cost_weight[1]/10)*loss_mask_ce + (cost_weight[2]/10)*loss_mask_dice # 2:5:5, like hungarian matching
- # print("idx {}, loss {}, loss_cls {}, loss_mask_ce {}, loss_mask_dice {}".format(idx, loss, loss_cls, loss_mask_ce, loss_mask_dice))
- return loss
-
-
-def point_sample_3d(input, point_coords, **kwargs):
- """
- from detectron2.projects.point_rend.point_features
- A wrapper around :function:`torch.nn.functional.grid_sample` to support 3D point_coords tensors.
- Unlike :function:`torch.nn.functional.grid_sample` it assumes `point_coords` to lie inside
- [0, 1] x [0, 1] square.
- Args:
- input (Tensor): A tensor of shape (N, C, D, H, W) that contains features map on a D x H x W grid.
- point_coords (Tensor): A tensor of shape (N, P, 3) or (N, Dgrid, Hgrid, Wgrid, 3) that contains
- [0, 1] x [0, 1] x [0, 1] normalized point coordinates.
- Returns:
- output (Tensor): A tensor of shape (N, C, P) or (N, C, Dgrid, Hgrid, Wgrid) that contains
- features for points in `point_coords`. The features are obtained via bilinear
- interplation from `input` the same way as :function:`torch.nn.functional.grid_sample`.
- """
- add_dim = False
- if point_coords.dim() == 3:
- add_dim = True
- point_coords = point_coords.unsqueeze(2).unsqueeze(2) # why
-
- # point_coords should be (N, D, H, W, 3)
- output = F.grid_sample(input, 2.0 * point_coords - 1.0, **kwargs)
-
- if add_dim:
- output = output.squeeze(3).squeeze(3)
-
- return output
-
-
-def calculate_uncertainty(logits):
- """
- We estimate uncerainty as L1 distance between 0.0 and the logit prediction in 'logits' for the
- foreground class in `classes`.
- Args:
- logits (Tensor): A tensor of shape (R, 1, ...) for class-specific or
- class-agnostic, where R is the total number of predicted masks in all images and C is
- the number of foreground classes. The values are logits.
- Returns:
- scores (Tensor): A tensor of shape (R, 1, ...) that contains uncertainty scores with
- the most uncertain locations having the highest uncertainty score.
- """
- assert logits.shape[1] == 1
- gt_class_logits = logits.clone()
- return -(torch.abs(gt_class_logits))
-
-
-# implemented!
-def get_uncertain_point_coords_with_randomness(
- coarse_logits, uncertainty_func, num_points, oversample_ratio, importance_sample_ratio):
- """
- Sample points in [0, 1] x [0, 1] coordinate space based on their uncertainty. The unceratinties
- are calculated for each point using 'uncertainty_func' function that takes point's logit
- prediction as input.
- See PointRend paper for details.
- Args:
- coarse_logits (Tensor): A tensor of shape (N, C, Hmask, Wmask) or (N, 1, Hmask, Wmask) for
- class-specific or class-agnostic prediction.
- uncertainty_func: A function that takes a Tensor of shape (N, C, P) or (N, 1, P) that
- contains logit predictions for P points and returns their uncertainties as a Tensor of
- shape (N, 1, P).
- num_points (int): The number of points P to sample.
- oversample_ratio (int): Oversampling parameter.
- importance_sample_ratio (float): Ratio of points that are sampled via importnace sampling.
- Returns:
- point_coords (Tensor): A tensor of shape (N, P, 2) that contains the coordinates of P
- sampled points.
- """
- assert oversample_ratio >= 1
- assert importance_sample_ratio <= 1 and importance_sample_ratio >= 0
- n_dim = 3
- num_boxes = coarse_logits.shape[0]
- num_sampled = int(num_points * oversample_ratio) # 12544 * 3, oversampled
- point_coords = torch.rand(num_boxes, num_sampled, n_dim, device=coarse_logits.device) # (K, 37632, 3); uniform dist [0, 1)
- point_logits = point_sample_3d(coarse_logits, point_coords, align_corners=False) # (K, 1, 37632)
-
- # It is crucial to calculate uncertainty based on the sampled prediction value for the points.
- # Calculating uncertainties of the coarse predictions first and sampling them for points leads
- # to incorrect results.
- # To illustrate this: assume uncertainty_func(logits)=-abs(logits), a sampled point between
- # two coarse predictions with -1 and 1 logits has 0 logits, and therefore 0 uncertainty value.
- # However, if we calculate uncertainties for the coarse predictions first,
- # both will have -1 uncertainty, and the sampled point will get -1 uncertainty.
- point_uncertainties = uncertainty_func(point_logits)
- num_uncertain_points = int(importance_sample_ratio * num_points) # 9408
-
- num_random_points = num_points - num_uncertain_points # 3136
- idx = torch.topk(point_uncertainties[:, 0, :], k=num_uncertain_points, dim=1)[1]
-
- shift = num_sampled * torch.arange(num_boxes, dtype=torch.long, device=coarse_logits.device)
- idx += shift[:, None] # [K, 9408]
-
- point_coords = point_coords.view(-1, n_dim)[idx.view(-1), :].view(
- num_boxes, num_uncertain_points, n_dim
- ) # [K, 9408, 3]
-
- if num_random_points > 0:
- # from detectron2.layers import cat
- point_coords = torch.cat(
- [
- point_coords,
- torch.rand(num_boxes, num_random_points, n_dim, device=coarse_logits.device),
- ],
- dim=1,
- ) # [K, 12544, 3]
-
- return point_coords
\ No newline at end of file
diff --git a/pymic/net/net3d/unet2d5.py b/pymic/net/net3d/unet2d5.py
deleted file mode 100644
index 4e70393..0000000
--- a/pymic/net/net3d/unet2d5.py
+++ /dev/null
@@ -1,289 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-
-import logging
-import torch
-import torch.nn as nn
-import numpy as np
-
-ConvND = {2: nn.Conv2d, 3: nn.Conv3d}
-BatchNormND = {2: nn.BatchNorm2d, 3: nn.BatchNorm3d}
-MaxPoolND = {2: nn.MaxPool2d, 3: nn.MaxPool3d}
-ConvTransND = {2: nn.ConvTranspose2d, 3: nn.ConvTranspose3d}
-
-class ConvBlockND(nn.Module):
- """
- 2D or 3D convolutional block
-
- :param in_channels: (int) Input channel number.
- :param out_channels: (int) Output channel number.
- :param dim: (int) Should be 2 or 3, for 2D and 3D convolution, respectively.
- :param dropout_p: (int) Dropout probability.
- """
- def __init__(self, in_channels, out_channels, dim = 2, dropout_p = 0.0):
- super(ConvBlockND, self).__init__()
- assert(dim == 2 or dim == 3)
- self.dim = dim
- self.conv_conv = nn.Sequential(
- ConvND[dim](in_channels, out_channels, kernel_size=3, padding=1),
- BatchNormND[dim](out_channels),
- nn.PReLU(),
- nn.Dropout(dropout_p),
- ConvND[dim](out_channels, out_channels, kernel_size=3, padding=1),
- BatchNormND[dim](out_channels),
- nn.PReLU()
- )
-
- def forward(self, x):
- output = self.conv_conv(x)
- return output
-
-class DownBlock(nn.Module):
- """`ConvBlockND` block followed by downsampling.
-
- :param in_channels: (int) Input channel number.
- :param out_channels: (int) Output channel number.
- :param dim: (int) Should be 2 or 3, for 2D and 3D convolution, respectively.
- :param dropout_p: (int) Dropout probability.
- :param downsample: (bool) Use downsample or not after convolution.
- """
- def __init__(self, in_channels, out_channels, dim = 2, dropout_p = 0.0, downsample = True):
- super(DownBlock, self).__init__()
- self.downsample = downsample
- self.dim = dim
- self.conv = ConvBlockND(in_channels, out_channels, dim, dropout_p)
- self.down_layer = MaxPoolND[dim](kernel_size = 2, stride = 2)
-
- def forward(self, x):
- x_shape = list(x.shape)
- if(self.dim == 2 and len(x_shape) == 5):
- [N, C, D, H, W] = x_shape
- new_shape = [N*D, C, H, W]
- x = torch.transpose(x, 1, 2)
- x = torch.reshape(x, new_shape)
- output = self.conv(x)
- if(self.downsample):
- output_d = self.down_layer(output)
- else:
- output_d = None
- if(self.dim == 2 and len(x_shape) == 5):
- new_shape = [N, D] + list(output.shape)[1:]
- output = torch.reshape(output, new_shape)
- output = torch.transpose(output, 1, 2)
- if(self.downsample):
- new_shape = [N, D] + list(output_d.shape)[1:]
- output_d = torch.reshape(output_d, new_shape)
- output_d = torch.transpose(output_d, 1, 2)
-
- return output, output_d
-
-class UpBlock(nn.Module):
- """Upsampling followed by `ConvBlockND` block
-
- :param in_channels1: (int) Input channel number for low-resolution feature map.
- :param in_channels2: (int) Input channel number for high-resolution feature map.
- :param out_channels: (int) Output channel number.
- :param dim: (int) Should be 2 or 3, for 2D and 3D convolution, respectively.
- :param dropout_p: (int) Dropout probability.
- :param up_mode: (string or int) The mode for upsampling. The allowed values are:
- 0 (or `TransConv`), 1 (`Nearest`), 2 (`Trilinear` for 3D and `Bilinear` for 2D).
- The default value is 2.
- """
- def __init__(self, in_channels1, in_channels2, out_channels,
- dim = 2, dropout_p = 0.0, up_mode= 2):
- super(UpBlock, self).__init__()
- if(isinstance(up_mode, int)):
- up_mode_values = ["transconv", "nearest", "trilinear"]
- if(up_mode > 2):
- raise ValueError("The upsample mode should be 0-2, but {0:} is given.".format(up_mode))
- self.up_mode = up_mode_values[up_mode]
- else:
- self.up_mode = up_mode.lower()
-
- self.dim = dim
- if (self.up_mode == "transconv"):
- self.up = ConvTransND[dim](in_channels1, in_channels2, kernel_size=2, stride=2)
- else:
- self.conv1x1 = ConvND[dim](in_channels1, in_channels2, kernel_size = 1)
- if(self.up_mode == "nearest"):
- self.up = nn.Upsample(scale_factor=2, mode=self.up_mode)
- else:
- mode = "trilinear" if dim == 3 else "bilinear"
- self.up = nn.Upsample(scale_factor=2, mode=mode, align_corners=True)
- self.conv = ConvBlockND(in_channels2 * 2, out_channels, dim, dropout_p)
-
- def forward(self, x1, x2):
- x1_shape = list(x1.shape)
- x2_shape = list(x2.shape)
- if(self.dim == 2 and len(x1_shape) == 5):
- [N, C, D, H, W] = x1_shape
- new_shape = [N*D, C, H, W]
- x1 = torch.transpose(x1, 1, 2)
- x1 = torch.reshape(x1, new_shape)
- [N, C, D, H, W] = x2_shape
- new_shape = [N*D, C, H, W]
- x2 = torch.transpose(x2, 1, 2)
- x2 = torch.reshape(x2, new_shape)
-
- if self.up_mode != "transconv":
- x1 = self.conv1x1(x1)
- x1 = self.up(x1)
- output = torch.cat([x2, x1], dim=1)
- output = self.conv(output)
- if(self.dim == 2 and len(x1_shape) == 5):
- new_shape = [N, D] + list(output.shape)[1:]
- output = torch.reshape(output, new_shape)
- output = torch.transpose(output, 1, 2)
- return output
-
-class Encoder(nn.Module):
- """
- A modification of the encoder of 3D UNet by using ConvScSEBlock3D
-
- Parameters are given in the `params` dictionary.
- See :mod:`pymic.net.net3d.unet3d.Encoder` for details.
- """
- def __init__(self, params):
- super(Encoder, self).__init__()
- self.params = params
- self.in_chns = self.params['in_chns']
- self.n_class = self.params['class_num']
- self.ft_chns = self.params['feature_chns']
- self.dropout = self.params['dropout']
- self.dims = self.params['conv_dims']
-
- self.block0 = DownBlock(self.in_chns, self.ft_chns[0], self.dims[0], self.dropout[0], True)
- self.block1 = DownBlock(self.ft_chns[0], self.ft_chns[1], self.dims[1], self.dropout[1], True)
- self.block2 = DownBlock(self.ft_chns[1], self.ft_chns[2], self.dims[2], self.dropout[2], True)
- self.block3 = DownBlock(self.ft_chns[2], self.ft_chns[3], self.dims[3], self.dropout[3], True)
- self.block4 = DownBlock(self.ft_chns[3], self.ft_chns[4], self.dims[4], self.dropout[4], False)
-
- def forward(self, x):
- x0, x0_d = self.block0(x)
- x1, x1_d = self.block1(x0_d)
- x2, x2_d = self.block2(x1_d)
- x3, x3_d = self.block3(x2_d)
- x4, x4_d = self.block4(x3_d)
- return [x0, x1, x2, x3, x4]
-
-class Decoder(nn.Module):
- """
- Decoder of 3D UNet.
-
- Parameters are given in the `params` dictionary, and should include the
- following fields:
-
- :param in_chns: (int) Input channel number.
- :param feature_chns: (list) Feature channel for each resolution level.
- The length should be 4 or 5, such as [16, 32, 64, 128, 256].
- :param dropout: (list) The dropout ratio for each resolution level.
- The length should be the same as that of `feature_chns`.
- :param class_num: (int) The class number for segmentation task.
- :param up_mode: (string or int) The mode for upsampling. The allowed values are:
- 0 (or `TransConv`), 1 (`Nearest`), 2 (`Trilinear` for 3D and `Bilinear` for 2D).
- The default value is 2.
- :param multiscale_pred: (bool) Get multi-scale prediction.
- """
- def __init__(self, params):
- super(Decoder, self).__init__()
- self.params = params
- self.in_chns = self.params['in_chns']
- self.n_class = self.params['class_num']
- self.ft_chns = self.params['feature_chns']
- self.dropout = self.params['dropout']
- self.dims = self.params['conv_dims']
- self.up_mode = self.params.get('up_mode', 2)
- self.mul_pred = self.params.get('multiscale_pred', False)
-
- self.up1 = UpBlock(self.ft_chns[4], self.ft_chns[3], self.ft_chns[3],
- self.dims[3], dropout_p = self.dropout[3], up_mode=self.up_mode)
- self.up2 = UpBlock(self.ft_chns[3], self.ft_chns[2], self.ft_chns[2],
- self.dims[2], dropout_p = self.dropout[2], up_mode=self.up_mode)
- self.up3 = UpBlock(self.ft_chns[2], self.ft_chns[1], self.ft_chns[1],
- self.dims[1], dropout_p = self.dropout[1], up_mode=self.up_mode)
- self.up4 = UpBlock(self.ft_chns[1], self.ft_chns[0], self.ft_chns[0],
- self.dims[0], dropout_p = self.dropout[0], up_mode=self.up_mode)
-
- self.out_conv = nn.Conv3d(self.ft_chns[0], self.n_class, kernel_size = 1)
- if(self.mul_pred):
- self.out_conv1 = nn.Conv3d(self.ft_chns[1], self.n_class, kernel_size = 1)
- self.out_conv2 = nn.Conv3d(self.ft_chns[2], self.n_class, kernel_size = 1)
- self.out_conv3 = nn.Conv3d(self.ft_chns[3], self.n_class, kernel_size = 1)
- self.stage = 'train'
-
- def set_stage(self, stage):
- self.stage = stage
-
- def forward(self, x):
- x0, x1, x2, x3, x4 = x
- x_d3 = self.up1(x4, x3)
- x_d2 = self.up2(x_d3, x2)
- x_d1 = self.up3(x_d2, x1)
- x_d0 = self.up4(x_d1, x0)
- output = self.out_conv(x_d0)
- if(self.mul_pred and self.stage == 'train'):
- output1 = self.out_conv1(x_d1)
- output2 = self.out_conv2(x_d2)
- output3 = self.out_conv3(x_d3)
- output = [output, output1, output2, output3]
- return output
-
-class UNet2D5(nn.Module):
- """
- A 2.5D network combining 3D convolutions with 2D convolutions.
-
- * Reference: Guotai Wang, Jonathan Shapey, Wenqi Li, Reuben Dorent, Alex Demitriadis,
- Sotirios Bisdas, Ian Paddick, Robert Bradford, Shaoting Zhang, Sébastien Ourselin,
- Tom Vercauteren: Automatic Segmentation of Vestibular Schwannoma from T2-Weighted
- MRI by Deep Spatial Attention with Hardness-Weighted Loss.
- `MICCAI (2) 2019: 264-272. `_
-
- Note that the attention module in the orininal paper is not used here.
-
- Parameters are given in the `params` dictionary, and should include the
- following fields:
-
- :param in_chns: (int) Input channel number.
- :param feature_chns: (list) Feature channel for each resolution level.
- The length should be 5, such as [16, 32, 64, 128, 256].
- :param dropout: (list) The dropout ratio for each resolution level.
- The length should be the same as that of `feature_chns`.
- :param conv_dims: (list) The convolution dimension (2 or 3) for each resolution level.
- The length should be the same as that of `feature_chns`.
- :param class_num: (int) The class number for segmentation task.
- :param up_mode: (string or int) The mode for upsampling. The allowed values are:
- 0 (or `TransConv`), 1 (`Nearest`), 2 (`Trilinear`). The default value
- is 2 (`Trilinear`).
- :param multiscale_pred: (bool) Get multi-scale prediction.
- """
- def __init__(self, params):
- super(UNet2D5, self).__init__()
- params = self.get_default_parameters(params)
- for p in params:
- print(p, params[p])
- self.stage = 'train'
- self.encoder = Encoder(params)
- self.decoder = Decoder(params)
-
- def get_default_parameters(self, params):
- default_param = {
- 'feature_chns': [32, 64, 128, 256, 512],
- 'dropout': [0.0, 0.0, 0.2, 0.3, 0.4],
- 'conv_dims':[2, 2, 3, 3, 3],
- 'up_mode': 2,
- 'multiscale_pred': False
- }
- for key in default_param:
- params[key] = params.get(key, default_param[key])
- for key in params:
- logging.info("{0:} = {1:}".format(key, params[key]))
- return params
-
- def set_stage(self, stage):
- self.stage = stage
- self.decoder.set_stage(stage)
-
- def forward(self, x):
- f = self.encoder(x)
- output = self.decoder(f)
- return output
diff --git a/pymic/net/net3d/unet3d.py b/pymic/net/net3d/unet3d.py
deleted file mode 100644
index 5954869..0000000
--- a/pymic/net/net3d/unet3d.py
+++ /dev/null
@@ -1,287 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-
-import logging
-import torch
-import torch.nn as nn
-import numpy as np
-from pymic.net.net_init import Initialization_He, Initialization_XavierUniform
-
-
-class ConvBlock(nn.Module):
- """
- Two 3D convolution layers with batch norm and leaky relu.
- Droput is used between the two convolution layers.
-
- :param in_channels: (int) Input channel number.
- :param out_channels: (int) Output channel number.
- :param dropout_p: (int) Dropout probability.
- """
- def __init__(self, in_channels, out_channels, dropout_p, norm_type = 'batch_norm'):
- super(ConvBlock, self).__init__()
- if(norm_type == 'batch_norm'):
- norm1 = nn.BatchNorm3d(out_channels, affine = True)
- norm2 = nn.BatchNorm3d(out_channels, affine = True)
- elif(norm_type == 'instance_norm'):
- norm1 = nn.InstanceNorm3d(out_channels, affine = True)
- norm2 = nn.InstanceNorm3d(out_channels, affine = True)
- else:
- raise ValueError("norm_type {0:} not supported, it should be batch_norm or instance_norm".format(norm_type))
- self.conv_conv = nn.Sequential(
- nn.Conv3d(in_channels, out_channels, kernel_size=3, padding=1),
- norm1,
- nn.LeakyReLU(),
- nn.Dropout(dropout_p),
- nn.Conv3d(out_channels, out_channels, kernel_size=3, padding=1),
- norm2,
- nn.LeakyReLU()
- )
-
- def forward(self, x):
- return self.conv_conv(x)
-
-class DownBlock(nn.Module):
- """
- 3D downsampling followed by ConvBlock
-
- :param in_channels: (int) Input channel number.
- :param out_channels: (int) Output channel number.
- :param dropout_p: (int) Dropout probability.
- """
- def __init__(self, in_channels, out_channels, dropout_p, norm_type = 'batch_norm'):
- super(DownBlock, self).__init__()
- self.maxpool_conv = nn.Sequential(
- nn.MaxPool3d(2),
- ConvBlock(in_channels, out_channels, dropout_p, norm_type)
- )
-
- def forward(self, x):
- return self.maxpool_conv(x)
-
-class UpBlock(nn.Module):
- """
- 3D upsampling followed by ConvBlock
-
- :param in_channels1: (int) Channel number of high-level features.
- :param in_channels2: (int) Channel number of low-level features.
- :param out_channels: (int) Output channel number.
- :param dropout_p: (int) Dropout probability.
- :param up_mode: (string or int) The mode for upsampling. The allowed values are:
- 0 (or `TransConv`), 1 (`Nearest`), 2 (`Trilinear`). The default value
- is 2 (`Trilinear`).
- """
- def __init__(self, in_channels1, in_channels2, out_channels, dropout_p,
- up_mode=2, norm_type = 'batch_norm'):
- super(UpBlock, self).__init__()
- if(isinstance(up_mode, int)):
- up_mode_values = ["transconv", "nearest", "trilinear"]
- if(up_mode > 2):
- raise ValueError("The upsample mode should be 0-2, but {0:} is given.".format(up_mode))
- self.up_mode = up_mode_values[up_mode]
- else:
- self.up_mode = up_mode.lower()
-
- if (self.up_mode == "transconv"):
- self.up = nn.ConvTranspose3d(in_channels1, in_channels2, kernel_size=2, stride=2)
- else:
- self.conv1x1 = nn.Conv3d(in_channels1, in_channels2, kernel_size = 1)
- if(self.up_mode == "nearest"):
- self.up = nn.Upsample(scale_factor=2, mode=self.up_mode)
- else:
- self.up = nn.Upsample(scale_factor=2, mode=self.up_mode, align_corners=True)
- self.conv = ConvBlock(in_channels2 * 2, out_channels, dropout_p, norm_type)
-
- def forward(self, x1, x2):
- if self.up_mode != "transconv":
- x1 = self.conv1x1(x1)
- x1 = self.up(x1)
- x = torch.cat([x2, x1], dim=1)
- return self.conv(x)
-
-class Encoder(nn.Module):
- """
- Encoder of 3D UNet.
-
- Parameters are given in the `params` dictionary, and should include the
- following fields:
-
- :param in_chns: (int) Input channel number.
- :param feature_chns: (list) Feature channel for each resolution level.
- The length should be 4 or 5, such as [16, 32, 64, 128, 256].
- :param dropout: (list) The dropout ratio for each resolution level.
- The length should be the same as that of `feature_chns`.
- """
- def __init__(self, params):
- super(Encoder, self).__init__()
- self.params = params
- in_chns = self.params['in_chns']
- ft_chns = self.params['feature_chns']
- dropout = self.params['dropout']
- norm_type = self.params['norm_type']
- assert(len(ft_chns) == 5 or len(ft_chns) == 4)
-
- self.ft_chns= ft_chns
- self.in_conv= ConvBlock(in_chns, ft_chns[0], dropout[0], norm_type)
- self.down1 = DownBlock(ft_chns[0], ft_chns[1], dropout[1], norm_type)
- self.down2 = DownBlock(ft_chns[1], ft_chns[2], dropout[2], norm_type)
- self.down3 = DownBlock(ft_chns[2], ft_chns[3], dropout[3], norm_type)
- if(len(ft_chns) == 5):
- self.down4 = DownBlock(ft_chns[3], ft_chns[4], dropout[4])
-
- def forward(self, x):
- x0 = self.in_conv(x)
- x1 = self.down1(x0)
- x2 = self.down2(x1)
- x3 = self.down3(x2)
- output = [x0, x1, x2, x3]
- if(len(self.ft_chns) == 5):
- x4 = self.down4(x3)
- output.append(x4)
- return output
-
-class Decoder(nn.Module):
- """
- Decoder of 3D UNet.
-
- Parameters are given in the `params` dictionary, and should include the
- following fields:
-
- :param in_chns: (int) Input channel number.
- :param feature_chns: (list) Feature channel for each resolution level.
- The length should be 4 or 5, such as [16, 32, 64, 128, 256].
- :param dropout: (list) The dropout ratio for each resolution level.
- The length should be the same as that of `feature_chns`.
- :param class_num: (int) The class number for segmentation task.
- :param up_mode: (string or int) The mode for upsampling. The allowed values are:
- 0 (or `TransConv`), 1 (`Nearest`), 2 (`Trilinear`). The default value
- is 2 (`Trilinear`).
- :param multiscale_pred: (bool) Get multi-scale prediction.
- """
- def __init__(self, params):
- super(Decoder, self).__init__()
- self.params = params
- ft_chns = self.params['feature_chns']
- dropout = self.params['dropout']
- n_class = self.params['class_num']
- norm_type = self.params['norm_type']
- up_mode = self.params.get('up_mode', 2)
- self.ft_chns = ft_chns
- self.mul_pred = self.params.get('multiscale_pred', False)
- assert(len(ft_chns) == 5 or len(ft_chns) == 4)
-
- if(len(ft_chns) == 5):
- self.up1 = UpBlock(ft_chns[4], ft_chns[3], ft_chns[3], dropout[3], up_mode, norm_type)
- self.up2 = UpBlock(ft_chns[3], ft_chns[2], ft_chns[2], dropout[2], up_mode, norm_type)
- self.up3 = UpBlock(ft_chns[2], ft_chns[1], ft_chns[1], dropout[1], up_mode, norm_type)
- self.up4 = UpBlock(ft_chns[1], ft_chns[0], ft_chns[0], dropout[0], up_mode, norm_type)
- self.out_conv = nn.Conv3d(ft_chns[0], n_class, kernel_size = 1)
-
- if(self.mul_pred):
- self.out_conv1 = nn.Conv3d(ft_chns[1], n_class, kernel_size = 1)
- self.out_conv2 = nn.Conv3d(ft_chns[2], n_class, kernel_size = 1)
- self.out_conv3 = nn.Conv3d(ft_chns[3], n_class, kernel_size = 1)
- self.stage = 'train'
-
- def set_stage(self, stage):
- self.stage = stage
-
- def forward(self, x):
- if(len(self.ft_chns) == 5):
- assert(len(x) == 5)
- x0, x1, x2, x3, x4 = x
- x_d3 = self.up1(x4, x3)
- else:
- assert(len(x) == 4)
- x0, x1, x2, x3 = x
- x_d3 = x3
- x_d2 = self.up2(x_d3, x2)
- x_d1 = self.up3(x_d2, x1)
- x_d0 = self.up4(x_d1, x0)
- output = self.out_conv(x_d0)
- if(self.mul_pred and self.stage == 'train'):
- output1 = self.out_conv1(x_d1)
- output2 = self.out_conv2(x_d2)
- output3 = self.out_conv3(x_d3)
- output = [output, output1, output2, output3]
- return output
-
-class UNet3D(nn.Module):
- """
- An implementation of the U-Net.
-
- * Reference: Özgün Çiçek, Ahmed Abdulkadir, Soeren S. Lienkamp, Thomas Brox, Olaf Ronneberger:
- 3D U-Net: Learning Dense Volumetric Segmentation from Sparse Annotation.
- `MICCAI (2) 2016: 424-432. `_
-
- Note that there are some modifications from the original paper, such as
- the use of batch normalization, dropout, leaky relu and deep supervision.
-
- Parameters are given in the `params` dictionary, and should include the
- following fields:
-
- :param in_chns: (int) Input channel number.
- :param feature_chns: (list) Feature channel for each resolution level.
- The length should be 4 or 5, such as [16, 32, 64, 128, 256].
- :param dropout: (list) The dropout ratio for each resolution level.
- The length should be the same as that of `feature_chns`.
- :param class_num: (int) The class number for segmentation task.
- :param up_mode: (string or int) The mode for upsampling. The allowed values are:
- 0 (or `TransConv`), 1 (`Nearest`), 2 (`Trilinear`). The default value
- is 2 (`Trilinear`).
- :param multiscale_pred: (bool) Get multi-scale prediction.
- """
- def __init__(self, params):
- super(UNet3D, self).__init__()
- params = self.get_default_parameters(params)
- for p in params:
- print(p, params[p])
- self.stage = 'train'
- self.tune_mode= params.get('finetune_mode', 'all')
- self.load_mode= params.get('weights_load_mode', 'all')
- self.encoder = Encoder(params)
- self.decoder = Decoder(params)
-
- init = params['initialization'].lower()
- weightInitializer = Initialization_He(1e-2) if init == 'he' else Initialization_XavierUniform()
- self.apply(weightInitializer)
-
- def get_default_parameters(self, params):
- default_param = {
- 'feature_chns': [32, 64, 128, 256, 512],
- 'dropout': [0.0, 0.0, 0.2, 0.3, 0.4],
- 'up_mode': 2,
- 'initialization': 'he',
- 'norm_type': 'batch_norm',
- 'multiscale_pred': False
- }
- for key in default_param:
- params[key] = params.get(key, default_param[key])
- for key in params:
- logging.info("{0:} = {1:}".format(key, params[key]))
- return params
-
- def set_stage(self, stage):
- self.stage = stage
- self.decoder.set_stage(stage)
-
-
- def forward(self, x):
- f = self.encoder(x)
- output = self.decoder(f)
- return output
-
- def get_parameters_to_update(self):
- if(self.tune_mode == "all"):
- return self.parameters()
- elif(self.tune_mode == "decoder"):
- print("only update parameters in decoder")
- params = self.decoder.parameters()
- return params
- else:
- raise(ValueError("update_mode can only be 'all' or 'decoder'."))
-
- def get_parameters_to_load(self):
- state_dict = self.state_dict()
- if(self.load_mode == 'encoder'):
- state_dict = {k:v for k, v in state_dict.items() if "encoder" in k }
- return state_dict
diff --git a/pymic/net/net3d/unet3d_dual_branch.py b/pymic/net/net3d/unet3d_dual_branch.py
deleted file mode 100644
index 54b01a0..0000000
--- a/pymic/net/net3d/unet3d_dual_branch.py
+++ /dev/null
@@ -1,45 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-
-import torch.nn as nn
-from pymic.net.net3d.unet3d import *
-
-class UNet3D_DualBranch(nn.Module):
- """
- A dual branch network using UNet3D as backbone.
-
- * Reference: Xiangde Luo, Minhao Hu, Wenjun Liao, Shuwei Zhai, Tao Song, Guotai Wang,
- Shaoting Zhang. ScribblScribble-Supervised Medical Image Segmentation via
- Dual-Branch Network and Dynamically Mixed Pseudo Labels Supervision.
- `MICCAI 2022. `_
-
- The parameters for the backbone should be given in the `params` dictionary.
- See :mod:`pymic.net.net3d.unet3d.UNet3D` for details.
- In addition, the following field should be included:
-
- :param output_mode: (str) How to obtain the result during the inference.
- `average`: taking average of the two branches.
- `first`: taking the result in the first branch.
- `second`: taking the result in the second branch.
- """
- def __init__(self, params):
- super(UNet3D_DualBranch, self).__init__()
- self.output_mode = params.get("output_mode", "average")
- self.encoder = Encoder(params)
- self.decoder1 = Decoder(params)
- self.decoder2 = Decoder(params)
-
- def forward(self, x):
- f = self.encoder(x)
- output1 = self.decoder1(f)
- output2 = self.decoder2(f)
-
- if(self.training):
- return output1, output2
- else:
- if(self.output_mode == "average"):
- return (output1 + output2)/2
- elif(self.output_mode == "first"):
- return output1
- else:
- return output2
diff --git a/pymic/net/net3d/unet3d_scse.py b/pymic/net/net3d/unet3d_scse.py
deleted file mode 100644
index 49cecc4..0000000
--- a/pymic/net/net3d/unet3d_scse.py
+++ /dev/null
@@ -1,121 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-import torch
-import torch.nn as nn
-import numpy as np
-from pymic.net.net3d.unet3d import UpBlock, Encoder, Decoder, UNet3D
-from pymic.net.net3d.scse3d import *
-
-class ConvScSEBlock3D(nn.Module):
- """
- Two 3D convolutional blocks followed by `ChannelSpatialSELayer3D`.
- Each block consists of `Conv3d` + `BatchNorm3d` + `LeakyReLU`.
- A dropout layer is used between the wo blocks.
-
- :param in_channels: (int) Input channel number.
- :param out_channels: (int) Output channel number.
- :param dropout_p: (int) Dropout probability.
- """
- def __init__(self, in_channels, out_channels, dropout_p):
- super(ConvScSEBlock3D, self).__init__()
- self.conv_conv = nn.Sequential(
- nn.Conv3d(in_channels, out_channels, kernel_size=3, padding=1),
- nn.BatchNorm3d(out_channels),
- nn.LeakyReLU(),
- nn.Dropout(dropout_p),
- nn.Conv3d(out_channels, out_channels, kernel_size=3, padding=1),
- nn.BatchNorm3d(out_channels),
- nn.LeakyReLU(),
- ChannelSpatialSELayer3D(out_channels)
- )
-
- def forward(self, x):
- return self.conv_conv(x)
-
-class DownBlock(nn.Module):
- """3D Downsampling followed by `ConvScSEBlock3D`.
-
- :param in_channels: (int) Input channel number.
- :param out_channels: (int) Output channel number.
- :param dropout_p: (int) Dropout probability.
- """
- def __init__(self, in_channels, out_channels, dropout_p):
- super(DownBlock, self).__init__()
- self.maxpool_conv = nn.Sequential(
- nn.MaxPool3d(2),
- ConvScSEBlock3D(in_channels, out_channels, dropout_p)
- )
-
- def forward(self, x):
- return self.maxpool_conv(x)
-
-class UpBlockScSE(UpBlock):
- """3D Up-sampling followed by `ConvScSEBlock3D` in UNet3D_ScSE.
-
- :param in_channels1: (int) Input channel number for low-resolution feature map.
- :param in_channels2: (int) Input channel number for high-resolution feature map.
- :param out_channels: (int) Output channel number.
- :param dropout_p: (int) Dropout probability.
- :param up_mode: (string or int) The mode for upsampling. The allowed values are:
- 0 (or `TransConv`), 1 (`Nearest`), 2 (`Trilinear`). The default value
- is 2 (`Trilinear`).
- """
- def __init__(self, in_channels1, in_channels2, out_channels, dropout_p, up_mode=2):
- super(UpBlockScSE, self).__init__(in_channels1, in_channels2,
- out_channels, dropout_p, up_mode)
- self.conv = ConvScSEBlock3D(in_channels2 * 2, out_channels, dropout_p)
-
-
-class EncoderScSE(Encoder):
- """
- A modification of the encoder of 3D UNet by using ConvScSEBlock3D
-
- Parameters are given in the `params` dictionary.
- See :mod:`pymic.net.net3d.unet3d.Encoder` for details.
- """
- def __init__(self, params):
- super(EncoderScSE, self).__init__(params)
-
- in_chns = self.params['in_chns']
- dropout = self.params['dropout']
- self.in_conv= ConvScSEBlock3D(in_chns, self.ft_chns[0], dropout[0])
- self.down1 = DownBlock(self.ft_chns[0], self.ft_chns[1], dropout[1])
- self.down2 = DownBlock(self.ft_chns[1], self.ft_chns[2], dropout[2])
- self.down3 = DownBlock(self.ft_chns[2], self.ft_chns[3], dropout[3])
- if(len(self.ft_chns) == 5):
- self.down4 = DownBlock(self.ft_chns[3], self.ft_chns[4], dropout[4])
-
-class DecoderScSE(Decoder):
- """
- A modification of the decoder of 3D UNet by using ConvScSEBlock3D
-
- Parameters are given in the `params` dictionary.
- See :mod:`pymic.net.net3d.unet3d.Decoder` for details.
- """
- def __init__(self, params):
- super(DecoderScSE, self).__init__(params)
- dropout = self.params['dropout']
- up_mode = self.params.get('up_mode', 2)
- if(len(self.ft_chns) == 5):
- self.up1 = UpBlockScSE(self.ft_chns[4], self.ft_chns[3], self.ft_chns[3], dropout[3], up_mode)
- self.up2 = UpBlockScSE(self.ft_chns[3], self.ft_chns[2], self.ft_chns[2], dropout[2], up_mode)
- self.up3 = UpBlockScSE(self.ft_chns[2], self.ft_chns[1], self.ft_chns[1], dropout[1], up_mode)
- self.up4 = UpBlockScSE(self.ft_chns[1], self.ft_chns[0], self.ft_chns[0], dropout[0], up_mode)
-
-
-class UNet3D_ScSE(UNet3D):
- """
- Combining 3D U-Net with SCSE module.
-
- * Reference: Abhijit Guha Roy, Nassir Navab, Christian Wachinger:
- Recalibrating Fully Convolutional Networks With Spatial and Channel
- "Squeeze and Excitation" Blocks.
- `IEEE Trans. Med. Imaging 38(2): 540-549 (2019). `_
-
- Parameters are given in the `params` dictionary.
- See :mod:`pymic.net.net3d.unet3d.UNet3D` for details.
- """
- def __init__(self, params):
- super(UNet3D_ScSE, self).__init__(params)
- self.encoder = EncoderScSE(params)
- self.decoder = DecoderScSE(params)
diff --git a/pymic/net/net_dict_cls.py b/pymic/net/net_dict_cls.py
deleted file mode 100644
index a83334a..0000000
--- a/pymic/net/net_dict_cls.py
+++ /dev/null
@@ -1,18 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-Built-in networks for classification.
-
-* resnet18 :mod:`pymic.net.cls.torch_pretrained_net.ResNet18`
-* vgg16 :mod:`pymic.net.cls.torch_pretrained_net.VGG16`
-* mobilenetv2 :mod:`pymic.net.cls.torch_pretrained_net.MobileNetV2`
-"""
-
-from __future__ import print_function, division
-from pymic.net.cls.torch_pretrained_net import *
-
-TorchClsNetDict = {
- 'resnet18': ResNet18,
- 'vgg16': VGG16,
- 'mobilenetv2':MobileNetV2,
- 'vitb16': ViTB16
-}
diff --git a/pymic/net/net_dict_seg.py b/pymic/net/net_dict_seg.py
deleted file mode 100644
index a5b0055..0000000
--- a/pymic/net/net_dict_seg.py
+++ /dev/null
@@ -1,96 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-Built-in networks for segmentation.
-
-* UNet2D :mod:`pymic.net.net2d.unet2d.UNet2D`
-* UNet2D_DualBranch :mod:`pymic.net.net2d.unet2d_dual_branch.UNet2D_DualBranch`
-* UNet2D_CCT :mod:`pymic.net.net2d.unet2d_cct.UNet2D_CCT`
-* UNet2D_ScSE :mod:`pymic.net.net2d.unet2d_scse.UNet2D_ScSE`
-* AttentionUNet2D :mod:`pymic.net.net2d.unet2d_attention.AttentionUNet2D`
-* MCNet2D :mod:`pymic.net.net2d.unet2d_mcnet.MCNet2D`
-* NestedUNet2D :mod:`pymic.net.net2d.unet2d_nest.NestedUNet2D`
-* COPLENet :mod:`pymic.net.net2d.cople_net.COPLENet`
-* UNet2D5 :mod:`pymic.net.net3d.unet2d5.UNet2D5`
-* UNet3D :mod:`pymic.net.net3d.unet3d.UNet3D`
-* UNet3D_ScSE :mod:`pymic.net.net3d.unet3d_scse.UNet3D_ScSE`
-"""
-from __future__ import print_function, division
-# from pymic.net.net2d.unet2d import UNet2D
-# from pymic.net.net2d.unet2d_multi_decoder import UNet2D_DualBranch, MCNet2D
-# from pymic.net.net2d.unet2d_mtnet import MTNet2D
-from pymic.net.cnn.unet import UNet
-from pymic.net.cnn.unet2d_canet import CANet
-from pymic.net.cnn.unet_scse import UNet_ScSE
-from pymic.net.cnn.coplenet2d import COPLENet
-from pymic.net.cnn.unet_attention import AttentionUNet
-from pymic.net.cnn.unet_pp import UNetpp
-from pymic.net.cnn.unet2d5 import UNet2D5
-
-# from pymic.net.net2d.unet2d_scse import UNet2D_ScSE
-from pymic.net.transformer.transunet import TransUNet
-from pymic.net.transformer.swinunet import SwinUNet
-# from pymic.net.net2d.umamba import UMambaBot, UMambaEnc
-# from pymic.net.net2d.unet2d_vm import VMUNet
-# from pymic.net.net2d.unet2d_vm_light import UltraLight_VM_UNet
-
-from pymic.net.net3d.fmunetv3 import FMUNetV3
-from pymic.net.net3d.fmunet import FMUNet
-from pymic.net.cnn.lcovnet3d import LCOVNet
-from pymic.net.net3d.unet3d_dual_branch import UNet3D_DualBranch
-
-# from pymic.net.net3d.mystunet import MySTUNet
-from pymic.net.transformer.unetr import UNETR
-from pymic.net.transformer.unetr_pp import UNETR_PP
-
-from pymic.net.specific.cctnet import CCTNet
-from pymic.net.specific.dbnet import DBNet
-from pymic.net.specific.tdnet import TDNet
-from pymic.net.specific.tdnet3d import TDNet3D
-
-# from pymic.net.third_party.nnFormer_wrap import nnFormer_wrap
-# from pymic.net.third_party.stunet_wrap import STUNet_wrap
-# from pymic.net.third_party.cotr_wrap import CoTr_wrap
-
-
-SegNetDict = {
- #
- # ---- networks for both 2D and 3D ---- #
- 'UNet': UNet,
- 'UNet_ScSE': UNet_ScSE,
- 'AttentionUNet': AttentionUNet,
- 'UNetpp': UNetpp,
- 'CANet': CANet,
- #
- # ---- networks for 2D ---- #
- 'COPLENet': COPLENet,
- 'TransUNet': TransUNet,
- 'SwinUNet': SwinUNet,
- # 'MCNet2D': MCNet2D,
- # 'MTNet2D': MTNet2D,
- # 'UNet2D_DualBranch': UNet2D_DualBranch,
- # 'UMambaBot': UMambaBot,
- # 'UMambaEnc': UMambaEnc,
- # 'VMUNet':VMUNet,
- # 'UltraLight_VM_UNet': UltraLight_VM_UNet,
- #
- # ---- networks for 3D ---- #
- 'UNet2D5': UNet2D5,
- 'LCOVNet': LCOVNet,
- 'FMUNet': FMUNet,
- 'FMUNetV3': FMUNetV3,
- 'UNETR': UNETR,
- 'UNETR_PP': UNETR_PP,
- # 'UNet3D_ScSE': UNet3D_ScSE,
- # 'UNet3D_DualBranch': UNet3D_DualBranch,
- # 'MySTUNet': MySTUNet,
- #
- # ---- special networks for weakly/semi-supervised segmentation ---- #
- 'CCTNet': CCTNet,
- 'DBNet': DBNet,
- 'TDNet': TDNet,
- #
- # ---- thirdy part networks ---- #
- # 'nnFormer': nnFormer_wrap,
- # 'STUNet': STUNet_wrap,
- # 'CoTr': CoTr_wrap
- }
diff --git a/pymic/net/net_init.py b/pymic/net/net_init.py
deleted file mode 100644
index 1f9b48e..0000000
--- a/pymic/net/net_init.py
+++ /dev/null
@@ -1,26 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-
-from torch import nn
-
-
-class Initialization_He(object):
- def __init__(self, neg_slope=1e-2):
- self.neg_slope = neg_slope
-
- def __call__(self, module):
- if isinstance(module, (nn.Conv3d, nn.Conv2d, nn.ConvTranspose2d, nn.ConvTranspose3d)):
- module.weight = nn.init.kaiming_normal_(module.weight, a=self.neg_slope)
- if module.bias is not None:
- module.bias = nn.init.constant_(module.bias, 0)
-
-
-class Initialization_XavierUniform(object):
- def __init__(self, gain=1):
- self.gain = gain
-
- def __call__(self, module):
- if isinstance(module, (nn.Conv3d ,nn.Conv2d, nn.ConvTranspose2d, nn.ConvTranspose3d)):
- module.weight = nn.init.xavier_uniform_(module.weight, self.gain)
- if module.bias is not None:
- module.bias = nn.init.constant_(module.bias, 0)
diff --git a/pymic/net/specific/__init__.py b/pymic/net/specific/__init__.py
deleted file mode 100644
index 72b8078..0000000
--- a/pymic/net/specific/__init__.py
+++ /dev/null
@@ -1,2 +0,0 @@
-from __future__ import absolute_import
-from . import *
\ No newline at end of file
diff --git a/pymic/net/specific/cctnet.py b/pymic/net/specific/cctnet.py
deleted file mode 100644
index 83e5ad6..0000000
--- a/pymic/net/specific/cctnet.py
+++ /dev/null
@@ -1,164 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-
-import torch
-import torch.nn as nn
-import torch.nn.functional as F
-import numpy as np
-from torch.distributions.uniform import Uniform
-from pymic.net.cnn.unet import Encoder, Decoder
-
-def _l2_normalize(d):
- """Normalizing per batch axis"""
- d_reshaped = d.view(d.shape[0], -1, *(1 for _ in range(d.dim() - 2)))
- d /= torch.norm(d_reshaped, dim=1, keepdim=True) + 1e-8
- return d
-
-
-def _get_r_adv(x_list, decoder, it=1, xi=1e-1, eps=10.0):
- """
- Virtual Adversarial Training according to
- https://arxiv.org/abs/1704.03976
- """
- x_detached = [item.detach() for item in x_list]
- xe_detached = x_detached[-1]
- with torch.no_grad():
- pred = F.softmax(decoder(x_detached), dim=1)
-
- d = torch.rand(x_list[-1].shape).sub(0.5).to(x_list[-1].device)
- d = _l2_normalize(d)
-
- for _ in range(it):
- d.requires_grad_()
- x_detached[-1] = xe_detached + xi * d
- pred_hat = decoder(x_detached)
- logp_hat = F.log_softmax(pred_hat, dim=1)
- adv_distance = F.kl_div(logp_hat, pred, reduction='batchmean')
- adv_distance.backward()
- d = _l2_normalize(d.grad)
- decoder.zero_grad()
-
- r_adv = d * eps
- return x_list[-1] + r_adv
-
-
-class AuxiliaryDecoder(nn.Module):
- """
- An Auxiliary Decoder.
- `aux_type` should be one of {`DropOut`, `FeatureDrop`, `FeatureNoise` and `VAT`}.
- Other parameters for the decoder are given in the `params` dictionary,
- see :mod:`pymic.net.net2d.unet2d.Decoder` for details.
- In addition, the following fields are needed for pertubation:
-
- :param Uniform_range: (float) The range of noise. Only needed when `aux_type`=`FeatureNoise`.
- :param VAT_it: (float) The iteration number of VAT. Only needed when `aux_type`=`VAT`.
- :param VAT_xi: (float) The hyper-parameter xi of VAT. Only needed when `aux_type`=`VAT`.
- :param VAT_eps: (float) The hyper-parameter eps of VAT. Only needed when `aux_type`=`VAT`.
-
- """
- def __init__(self, params, aux_type):
- super(AuxiliaryDecoder, self).__init__()
- self.dim = params['dimension']
- self.params = params
- self.decoder = Decoder(params)
- self.aux_type = aux_type
- uniform_range = params.get("Uniform_range".lower(), 0.3)
- self.uni_dist = Uniform(-uniform_range, uniform_range)
-
- def feature_drop(self, x):
- attention = torch.mean(x, dim=1, keepdim=True)
- max_val, _ = torch.max(attention.view(x.size(0), -1), dim=1, keepdim=True)
- threshold = max_val * np.random.uniform(0.7, 0.9)
- if(self.dim == 2):
- threshold = threshold.view(x.size(0), 1, 1, 1).expand_as(attention)
- else:
- threshold = threshold.view(x.size(0), 1, 1, 1, 1).expand_as(attention)
- drop_mask = (attention < threshold).float()
- return x.mul(drop_mask)
-
- def feature_based_noise(self, x):
- noise_vector = self.uni_dist.sample(x.shape[1:]).to(x.device).unsqueeze(0)
- x_noise = x.mul(noise_vector) + x
- return x_noise
-
- def forward(self, x):
- if(self.aux_type == "DropOut"):
- pass
- elif(self.aux_type == "FeatureDrop"):
- x[-1] = self.feature_drop(x[-1])
- elif(self.aux_type == "FeatureNoise"):
- x[-1] = self.feature_based_noise(x[-1])
- elif(self.aux_type == "VAT"):
- it = self.params.get("VAT_it".lower(), 2)
- xi = self.params.get("VAT_xi".lower(), 1e-6)
- eps= self.params.get("VAT_eps".lower(), 2.0)
- x[-1] = _get_r_adv(x, self.decoder, it, xi, eps)
- else:
- raise ValueError("Undefined auxiliary decoder type {0:}".format(self.aux_type))
-
- output = self.decoder(x)
- return output
-
-
-class CCTNet(nn.Module):
- """
- An modification the U-Net with auxiliary decoders according to
- the CCT paper.
-
- * Reference: Yassine Ouali, Celine Hudelot and Myriam Tami:
- Semi-Supervised Semantic Segmentation With Cross-Consistency Training.
- `CVPR 2020. `_
-
- Code adapted from `Github. `_
-
- Parameter for the network backbone are given in the `params` dictionary,
- see :mod:`pymic.net.net2d.unet2d.UNet2D` for details.
- In addition, the following fields are needed for pertubation
- in the auxiliary decoders:
-
- :param CCT_aux_decoders: (list) A list of auxiliary decoder types.
- Supported values are {`DropOut`, `FeatureDrop`, `FeatureNoise` and `VAT`}.
-
- The parameters for different types of auxiliary decoders should also be
- given in the `params` dictionary,
- see :mod:`pymic.net.net2d.unet2d_cct.AuxiliaryDecoder` for details.
- """
- def __init__(self, params):
- super(CCTNet, self).__init__()
- self.dim = params['dimension']
- self.params = params
- self.encoder = Encoder(params)
- self.decoder = Decoder(params)
- aux_names = params.get("CCT_aux_decoders".lower(), None)
- if aux_names is None:
- aux_names = ["DropOut", "FeatureDrop", "FeatureNoise", "VAT"]
- aux_decoders = []
- for aux_name in aux_names:
- aux_decoders.append(AuxiliaryDecoder(params, aux_name))
- self.aux_decoders = nn.ModuleList(aux_decoders)
-
-
- def forward(self, x):
- x_shape = list(x.shape)
- if(len(x_shape) == 5 and self.dim == 2):
- [N, C, D, H, W] = x_shape
- new_shape = [N*D, C, H, W]
- x = torch.transpose(x, 1, 2)
- x = torch.reshape(x, new_shape)
-
- f = self.encoder(x)
- output = self.decoder(f)
- if(len(x_shape) == 5 and self.dim == 2):
- new_shape = [N, D] + list(output.shape)[1:]
- output = torch.reshape(output, new_shape)
- output = torch.transpose(output, 1, 2)
-
- if(self.training):
- aux_outputs = [aux_d(f) for aux_d in self.aux_decoders]
- if(len(x_shape) == 5 and self.dim == 2):
- for i in range(len(aux_outputs)):
- aux_outi = torch.reshape(aux_outputs[i], new_shape)
- aux_outputs[i] = torch.transpose(aux_outi, 1, 2)
- return output, aux_outputs
- else:
- return output
\ No newline at end of file
diff --git a/pymic/net/specific/dbnet.py b/pymic/net/specific/dbnet.py
deleted file mode 100644
index 9dc52fe..0000000
--- a/pymic/net/specific/dbnet.py
+++ /dev/null
@@ -1,68 +0,0 @@
-# -*- coding: utf-8 -*-
-'''`
-Implementation of DBNet (dual branch network) used in DMSPS for scribble-supervised segmentation.
- https://www.sciencedirect.com/science/article/abs/pii/S1361841524001993?dgcid
- @article{han2024dmsps,
- title={DMSPS: Dynamically mixed soft pseudo-label supervision for scribble-supervised medical image segmentation},
- author={Han, Meng and Luo, Xiangde and Xie, Xiangjiang and Liao, Wenjun and Zhang, Shichuan and Song, Tao and Wang, Guotai and Zhang, Shaoting},
- journal={Medical Image Analysis},
- pages={103274},
- year={2024},
- publisher={Elsevier}
-}
-
-'''
-
-from __future__ import print_function, division
-import torch
-import torch.nn as nn
-from pymic.util.parse_config import *
-from pymic.net.cnn.unet import Encoder, Decoder
-
-
-def Dropout(x, dim, p=0.5):
- if dim == 2:
- x = torch.nn.functional.dropout2d(x, p)
- else:
- x = torch.nn.functional.dropout3d(x, p)
- return x
-
-class DBNet(nn.Module):
- def __init__(self, params):
- super(DBNet, self).__init__()
- self.dim = params['dimension']
- self.encoder = Encoder(params)
- self.main_decoder = Decoder(params)
- self.aux_decoder = Decoder(params)
-
- # def forward(self, x):
- # feature = self.encoder(x)
- # main_out = self.main_decoder(feature)
- # aux_feature = [Dropout(i) for i in feature]
- # aux_out1 = self.aux_decoder1(aux_feature)
- # return main_out, aux_out1
-
- def forward(self, x):
- x_shape = list(x.shape)
- if (self.dim == 2 and len(x_shape) == 5):
- [N, C, D, H, W] = x_shape
- new_shape = [N*D, C, H, W]
- x = torch.transpose(x, 1, 2)
- x = torch.reshape(x, new_shape)
-
- main_feat= self.encoder(x)
- main_out = self.main_decoder(main_feat)
- aux_feat = [Dropout(i, self.dim) for i in main_feat]
- aux_out = self.aux_decoder(aux_feat)
-
- if(self.dim == 2 and len(x_shape) == 5):
- if(isinstance(main_out, (list,tuple))):
- for i in range(len(main_out)):
- new_shape = [N, D] + list(main_out[i].shape)[1:]
- main_out[i] = torch.transpose(torch.reshape(main_out[i], new_shape), 1, 2)
- aux_out[i] = torch.transpose(torch.reshape(aux_out[i], new_shape), 1, 2)
- else:
- new_shape = [N, D] + list(main_out.shape)[1:]
- main_out = torch.transpose(torch.reshape(main_out, new_shape), 1, 2)
- aux_out = torch.transpose(torch.reshape(aux_out, new_shape), 1, 2)
- return main_out, aux_out
\ No newline at end of file
diff --git a/pymic/net/specific/mcnet.py b/pymic/net/specific/mcnet.py
deleted file mode 100644
index 97ca429..0000000
--- a/pymic/net/specific/mcnet.py
+++ /dev/null
@@ -1,87 +0,0 @@
-# -*- coding: utf-8 -*-
-'''`
-Implementation of DBNet (dual branch network) used in DMSPS for scribble-supervised segmentation.
- https://www.sciencedirect.com/science/article/abs/pii/S1361841524001993?dgcid
- @article{han2024dmsps,
- title={DMSPS: Dynamically mixed soft pseudo-label supervision for scribble-supervised medical image segmentation},
- author={Han, Meng and Luo, Xiangde and Xie, Xiangjiang and Liao, Wenjun and Zhang, Shichuan and Song, Tao and Wang, Guotai and Zhang, Shaoting},
- journal={Medical Image Analysis},
- pages={103274},
- year={2024},
- publisher={Elsevier}
-}
-
-'''
-
-from __future__ import print_function, division
-import copy
-import torch
-import torch.nn as nn
-from pymic.util.parse_config import *
-from pymic.net.cnn.unet import Encoder, Decoder
-
-class MCNet(nn.Nodule):
- """
- A tri-branch network using UNet2D as backbone.
-
- * Reference: Yicheng Wu, Zongyuan Ge et al. Mutual consistency learning for
- semi-supervised medical image segmentation.
- `Medical Image Analysis 2022. `_
-
- The original code is at: https://github.com/ycwu1997/MC-Net
-
- The parameters for the backbone should be given in the `params` dictionary.
- See :mod:`pymic.net.net2d.unet2d.UNet2D` for details.
- """
- def __init__(self, params):
- super(MCNet, self).__init__()
- params = self.get_default_parameters(params)
- self.dim = params['dimension']
- params1 = copy.deepcopy(params)
- params2 = copy.deepcopy(params)
- params3 = copy.deepcopy(params)
- params1['up_mode'] = 0
- params2['up_mode'] = 1
- params3['up_mode'] = 2
-
- self.encoder = Encoder(params1)
- self.decoder1 = Decoder(params1)
- self.decoder2 = Decoder(params2)
- self.decoder3 = Decoder(params3)
-
- def get_default_parameters(self, params):
- default_param = {
- 'feature_chns': [32, 64, 128, 256, 512],
- 'dropout': [0.0, 0.0, 0.2, 0.3, 0.4],
- 'up_mode': 2,
- 'multiscale_pred': False,
- }
- for key in default_param:
- params[key] = params.get(key, default_param[key])
- for key in params:
- logging.info("{0:} = {1:}".format(key, params[key]))
- return params
-
- def forward(self, x):
- x_shape = list(x.shape)
- if(self.dim == 2 and len(x_shape) == 5):
- [N, C, D, H, W] = x_shape
- new_shape = [N*D, C, H, W]
- x = torch.transpose(x, 1, 2)
- x = torch.reshape(x, new_shape)
-
- feature = self.encoder(x)
- output1 = self.decoder1(feature)
-
- if(self.dim == 2 and len(x_shape) == 5):
- new_shape = [N, D] + list(output1.shape)[1:]
- output1 = torch.transpose(torch.reshape(output1, new_shape), 1, 2)
- if(not self.training):
- return output1
- else:
- output2 = self.decoder2(feature)
- output3 = self.decoder3(feature)
- if(self.dim == 2 and len(x_shape) == 5):
- output2 = torch.transpose(torch.reshape(output2, new_shape), 1, 2)
- output3 = torch.transpose(torch.reshape(output3, new_shape), 1, 2)
- return output1, output2, output3
\ No newline at end of file
diff --git a/pymic/net/specific/mtnet.py b/pymic/net/specific/mtnet.py
deleted file mode 100644
index c2eb255..0000000
--- a/pymic/net/specific/mtnet.py
+++ /dev/null
@@ -1,151 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-import copy
-import torch
-import torch.nn as nn
-from pymic.net.cnn.basic_layer import get_conv_class
-from pymic.net.cnn.unet import ConvBlock, UpBlock, Encoder, Decoder
-from pymic.net.specific.mcnet import MCNet
-# from pymic.net.net2d.unet2d import *
-# from pymic.net.net2d.unet2d_multi_decoder import UNet2D_TriBranch
-
-class ChannelAttention(nn.Module):
- def __init__(self, dim, in_planes, ratio=16):
- super(ChannelAttention, self).__init__()
- if(dim == 2):
- self.avg_pool = nn.AdaptiveAvgPool2d(1)
- self.max_pool = nn.AdaptiveMaxPool2d(1)
- else:
- self.avg_pool = nn.AdaptiveAvgPool3d(1)
- self.max_pool = nn.AdaptiveMaxPool3d(1)
- conv_nd = get_conv_class(dim)
- self.fc1 = conv_nd(in_planes, in_planes // ratio, 1, bias=False)
- self.relu1 = nn.ReLU()
- self.fc2 = conv_nd(in_planes // ratio, in_planes, 1, bias=False)
- self.sigmoid = nn.Sigmoid()
-
- def forward(self, x):
- avg_out = self.fc2(self.relu1(self.fc1(self.avg_pool(x))))
- max_out = self.fc2(self.relu1(self.fc1(self.max_pool(x))))
- out = avg_out + max_out
- return x*self.sigmoid(out)
-
-class SpatialAttention(nn.Module):
- def __init__(self, dim, kernel_size=7):
- super(SpatialAttention, self).__init__()
-
- # assert kernel_size in (3, 7), 'kernel size must be 3 or 7'
- # padding = 3 if kernel_size == 7 else 1
- padding = (kernel_size - 1) / 2
- conv_nd = get_conv_class(dim)
- self.conv1 = conv_nd(2, 1, kernel_size, padding=padding, bias=False)
- self.sigmoid = nn.Sigmoid()
-
- def forward(self, x):
- avg_out = torch.mean(x, dim=1, keepdim=True)
- max_out, _ = torch.max(x, dim=1, keepdim=True)
- y = torch.cat([avg_out, max_out], dim=1)
- y = self.conv1(y)
- return x*self.sigmoid(y)
-
-class CBAM(nn.Module):
- def __init__(self, dim, in_planes, ratio=16, kernel_size=7):
- super(CBAM, self).__init__()
- self.ca = ChannelAttention(dim, in_planes, ratio)
- self.sa = SpatialAttention(dim, kernel_size)
-
- def forward(self, x):
- out = self.ca(x)
- result = self.sa(out)
- return result
-
-class ConvAttentionBlock(ConvBlock):
- """
- Two convolutional blocks with spatial or channel attention.
- Each block consists of `Conv2d` + `BatchNorm2d` + `Attention` + `LeakyReLU`.
- A dropout layer is used between the two blocks.
-
- :param in_channels: (int) Input channel number.
- :param out_channels: (int) Output channel number.
- :param dropout_p: (int) Dropout probability.
- :param attention_mode: (int) Attention mode. 0--spatial attention; 1--channel attention; 2--CBAM
- """
- def __init__(self, dim, in_channels, out_channels, dropout_p, attention_mode = 0):
- super(ConvAttentionBlock, self).__init__(dim, in_channels, out_channels, dropout_p)
- if(attention_mode == 0):
- self.att = SpatialAttention(dim)
- elif(attention_mode == 1):
- self.att = ChannelAttention(dim, out_channels)
- else:
- self.att = CBAM(dim, out_channels)
-
- def forward(self, x):
- x = self.conv_conv(x)
- x = self.att(x)
- return x
-
-class UpBlockAttention(UpBlock):
- """Up-sampling followed by `ConvAttentionBlock` in U-Net structure.
-
- The parameters for the backbone should be given in the `params` dictionary.
- See :mod:`pymic.net.net2d.unet2d.UpBlock` for details.
- """
- def __init__(self, dim, in_channels1, in_channels2, out_channels, dropout_p, up_mode = 2, attention_mode = 0):
- super(UpBlockAttention, self).__init__(dim, in_channels1, in_channels2, out_channels, dropout_p, up_mode)
- self.conv = ConvAttentionBlock(dim, in_channels2 * 2, out_channels, dropout_p, attention_mode)
-
-class DecoderAttention(Decoder):
- """
- Decoder of 2D UNet with Attention.
-
- The parameters for the backbone should be given in the `params` dictionary.
- See :mod:`pymic.net.net2d.unet2d.Decoder` for details.
-
- Parameters specific to this class:
-
- :param attention_mode: (int) 0--spatial attention; 1--channel attention; 2--CBAM
- """
- def __init__(self, params):
- super(DecoderAttention, self).__init__(params)
- att_mode = params.get("attention_mode", 0)
-
- self.up1 = UpBlockAttention(self.dim, self.ft_chns[4], self.ft_chns[3], self.ft_chns[3], self.dropout[3], self.up_mode, att_mode)
- self.up2 = UpBlockAttention(self.dim, self.ft_chns[3], self.ft_chns[2], self.ft_chns[2], self.dropout[2], self.up_mode, att_mode)
- self.up3 = UpBlockAttention(self.dim, self.ft_chns[2], self.ft_chns[1], self.ft_chns[1], self.dropout[1], self.up_mode, att_mode)
- self.up4 = UpBlock(self.dim, self.ft_chns[1], self.ft_chns[0], self.ft_chns[0], self.dropout[0], self.up_mode)
-
-
-class MTNet(MCNet):
- """
- A tri-branch network based on different attentions using UNet2D as backbone.
- It is used originally designed for semi-supervised segmentation.
-
- * Lanfeng Zhong, et al. Semi-supervised Pathological Image Segmentation via Cross
- Distillation of Multiple Attentions.
- `MICCAI 2023. `_
-
- * Lanfeng Zhong, et al. Semi-supervised pathological image
- segmentation via cross distillation of multiple attentions and Seg-CAM consistency.
- `Pattern Recognition 2024. `_
-
- The original code is at: https://github.com/HiLab-git/CDMA
-
- The parameters for the backbone should be given in the `params` dictionary.
- See :mod:`pymic.net.net2d.unet2d.UNet2D` for details.
- """
- def __init__(self, params):
- super(MTNet, self).__init__(params)
- params = self.get_default_parameters(params)
- params1 = copy.deepcopy(params)
- params2 = copy.deepcopy(params)
- params3 = copy.deepcopy(params)
- params1['attention_mode'] = 2
- params2['attention_mode'] = 0
- params3['attention_mode'] = 1
-
- self.encoder = Encoder(params1)
- self.decoder1 = DecoderAttention(params1)
- self.decoder2 = DecoderAttention(params2)
- self.decoder3 = DecoderAttention(params3)
-
-
diff --git a/pymic/net/specific/tdnet.py b/pymic/net/specific/tdnet.py
deleted file mode 100644
index 84a9b9a..0000000
--- a/pymic/net/specific/tdnet.py
+++ /dev/null
@@ -1,185 +0,0 @@
-# -*- coding: utf-8 -*-
-'''`
-Implementation of TDNet (triple branch multi-dilated network) used in PSSeg for scribble-supervised segmentation.
- https://www.sciencedirect.com/science/article/pii/S0925231226002341
- @article{han2025psseg,
- title={PS-Seg: Learning from partial scribbles for 3D multiple abdominal organ segmentation},
- author={Han, Meng and Ma, Xiaochuan and Luo, Xiangde and Liao, Wenjun and Zhang, Shichuan and Zhang, Shaoting and Wang, Guotai},
- journal={Neurocomputing},
- volume={672},
- pages={132837},
- year={2026},
- publisher={Elsevier}
-}
-
-'''
-from __future__ import print_function, division
-
-import logging
-import copy
-import torch
-import torch.nn as nn
-import numpy as np
-import random
-from pymic.net.cnn.basic_layer import *
-from pymic.net.cnn.unet import Encoder, UpBlock
-
-def Dropout_random(x, dim = 2):
- dropout_p = round(random.uniform(0.2, 0.5), 2)
- if dim == 2:
- x = torch.nn.functional.dropout2d(x, dropout_p)
- else:
- x = torch.nn.functional.dropout3d(x, dropout_p)
- return x
-
-
-def FeatureDropout(x, dim = 2):
- attention = torch.mean(x, dim=1, keepdim=True)
- max_val, _ = torch.max(attention.view(
- x.size(0), -1), dim=1, keepdim=True)
- threshold = max_val * np.random.uniform(0.7, 0.9)
- if(dim == 2):
- threshold = threshold.view(x.size(0), 1, 1, 1).expand_as(attention)
- else:
- threshold = threshold.view(x.size(0), 1, 1, 1, 1).expand_as(attention)
- drop_mask = (attention < threshold).float()
- x = x.mul(drop_mask)
- return x
-
-class Decoder(nn.Module):
- def __init__(self, params):
- super(Decoder, self).__init__()
- self.params = params
- self.dim = self.params['dimension']
- ft_chns = self.params['feature_chns']
- dropout = self.params['dropout']
- n_class = self.params['class_num']
- up_mode = self.params.get('up_mode', 2)
-
- padding = self.params['dilation']
- dilation = self.params['dilation']
-
- assert(len(ft_chns) == 5)
- self.up4 = UpBlock(self.dim, ft_chns[4], ft_chns[3], ft_chns[3], dropout[3], up_mode, padding = 1, dilation = 1)
- self.up3 = UpBlock(self.dim, ft_chns[3], ft_chns[2], ft_chns[2], dropout[2], up_mode, padding = padding, dilation = dilation)
- self.up2 = UpBlock(self.dim, ft_chns[2], ft_chns[1], ft_chns[1], dropout[1], up_mode, padding = padding, dilation = dilation)
- self.up1 = UpBlock(self.dim, ft_chns[1], ft_chns[0], ft_chns[0], dropout[0], up_mode, padding = padding, dilation = dilation)
-
- conv_nd = get_conv_class(self.dim)
- self.out_conv = conv_nd(ft_chns[0], n_class, kernel_size = 1)
- self.out_conv2 = conv_nd(ft_chns[1], n_class, kernel_size = 1)
- self.out_conv3 = conv_nd(ft_chns[2], n_class, kernel_size = 1)
- self.out_conv4 = conv_nd(ft_chns[3], n_class, kernel_size = 1)
- self.stage = 'train'
-
- self.apply(self.init_weight)
-
- def init_weight(self, m):
- init_type = self.params['init_type'] #select mode: kaiming, xavier, normal, orthogonal
- if(isinstance(m, nn.Linear) or isinstance(m, nn.Conv2d) or isinstance(m, nn.Conv3d)):
- if(init_type == "kaiming"):
- nn.init.kaiming_normal_(m.weight.data, a=0, mode='fan_in')
- elif(init_type == "xavier"):
- nn.init.xavier_normal_(m.weight.data, gain=1)
- else:
- nn.init.normal_(m.weight, 0.0, 0.02)
-
-
- def forward(self, x):
- x0, x1, x2, x3, x4 = x
- x3_dec = self.up4(x4, x3)
- x2_dec = self.up3(x3_dec, x2)
- x1_dec = self.up2(x2_dec, x1)
- x0_dec = self.up1(x1_dec, x0)
- output = self.out_conv(x0_dec)
- output_2 = self.out_conv2(x1_dec)
- output_3 = self.out_conv3(x2_dec)
- output_4 = self.out_conv4(x3_dec)
-
- return output, output_2, output_3, output_4
-
-class TDNet(nn.Module):
- def __init__(self, params):
- super(TDNet, self).__init__()
- params = self.get_default_parameters(params)
- self.dim = params['dimension']
- init_types = params['init_types']
- dilation_rates = params['dilation_rates']
- for p in params:
- print(p, params[p])
-
- params_decoder = copy.deepcopy(params)
- params_decoder['init_type'] = init_types[0]
- params_decoder['dilation'] = dilation_rates[0]
-
- params_deaux1 = copy.deepcopy(params)
- params_deaux1['init_type'] = init_types[1]
- params_deaux1['dilation'] = dilation_rates[1]
-
- params_deaux2 = copy.deepcopy(params)
- params_deaux2['init_type'] = init_types[2]
- params_deaux2['dilation'] = dilation_rates[2]
-
- self.encoder = Encoder(params)
- self.main_decoder = Decoder(params_decoder)
- self.aux_decoder1 = Decoder(params_deaux1)
- self.aux_decoder2 = Decoder(params_deaux2)
-
- def get_default_parameters(self, params):
- default_param = {
- 'feature_chns': [16, 32, 64, 128, 256],
- 'dropout': [0.00, 0.1, 0.2, 0.3, 0.5],
- 'up_mode': 2,
- 'norm_type': 'batch_norm',
- 'init_types': ['kaiming', 'xavier', 'normal'],
- 'dilation_rates': [1,1,1]}
- for key in default_param:
- params[key] = params.get(key, default_param[key])
- for key in params:
- logging.info("{0:} = {1:}".format(key, params[key]))
- return params
-
- def transpose_decoder_outputs(self, batch_size, slice_num, outputs):
- """
- transpose a 4D tensor to a 5D one. Split the 2D batch size into 3D
- batch size times slice number
- """
- for i in range(len(outputs)):
- new_shape = [batch_size, slice_num] + list(outputs[i].shape)[1:]
- outputs[i] = torch.transpose(torch.reshape(outputs[i], new_shape), 1, 2)
- return outputs
-
- def forward(self, x):
- x_shape = list(x.shape)
- if (self.dim == 2 and len(x_shape) == 5):
- [N, C, D, H, W] = x_shape
- new_shape = [N*D, C, H, W]
- x = torch.transpose(x, 1, 2)
- x = torch.reshape(x, new_shape)
-
-
- features = self.encoder(x)
- main_out, main_feat1, main_feat2, main_feat3 = self.main_decoder(features)
-
- aux1_feature = [Dropout_random(i, self.dim) for i in features]
- aux2_feature = [FeatureDropout(i, self.dim) for i in features]
- aux1_out, aux1_feat1, aux1_feat2, aux1_feat3 = self.aux_decoder1(aux1_feature)
- aux2_out, aux2_feat1, aux2_feat2, aux2_feat3 = self.aux_decoder2(aux2_feature)
-
- if(self.dim == 2 and len(x_shape) == 5):
- main_out, main_feat1, main_feat2, main_feat3 = self.transpose_decoder_outputs(N, D,
- [main_out, main_feat1, main_feat2, main_feat3]
- )
- aux1_out, aux1_feat1, aux1_feat2, aux1_feat3 = self.transpose_decoder_outputs(N, D,
- [aux1_out, aux1_feat1, aux1_feat2, aux1_feat3]
- )
- aux2_out, aux2_feat1, aux2_feat2, aux2_feat3 = self.transpose_decoder_outputs(N, D,
- [aux2_out, aux2_feat1, aux2_feat2, aux2_feat3]
- )
-
- if self.training:
- return [main_out, aux1_out, aux2_out], [main_feat1, aux1_feat1, aux2_feat1],\
- [main_feat2, aux1_feat2, aux2_feat2], [main_feat3, aux1_feat3, aux2_feat3]
- else:
- return main_out, aux1_out, aux2_out
-
\ No newline at end of file
diff --git a/pymic/net/specific/tdnet3d.py b/pymic/net/specific/tdnet3d.py
deleted file mode 100644
index dcafe96..0000000
--- a/pymic/net/specific/tdnet3d.py
+++ /dev/null
@@ -1,273 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-
-import logging
-import copy
-import torch
-import torch.nn as nn
-import numpy as np
-import random
-
-class ConvBlock3D(nn.Module):
- """
- Two 3D convolution layers with batch norm and leaky relu.
- Droput is used between the two convolution layers.
-
- :param in_channels: (int) Input channel number.
- :param out_channels: (int) Output channel number.
- :param dropout_p: (int) Dropout probability.
- """
- def __init__(self, in_channels, out_channels, dropout_p, kernel_size=3,
- padding_size=1, dilation_size=1):
- super(ConvBlock3D, self).__init__()
- norm1 = nn.BatchNorm3d(out_channels, affine = True)
- norm2 = nn.BatchNorm3d(out_channels, affine = True)
- self.conv_conv = nn.Sequential(
- nn.Conv3d(in_channels, out_channels, kernel_size = kernel_size,
- padding = padding_size, dilation = dilation_size),
- norm1,
- nn.LeakyReLU(),
- nn.Dropout(dropout_p),
- nn.Conv3d(out_channels, out_channels, kernel_size = kernel_size,
- padding = padding_size, dilation = dilation_size),
- norm2,
- nn.LeakyReLU()
- )
-
- def forward(self, x):
- return self.conv_conv(x)
-
-
-class UpBlock3D(nn.Module):
- """upsample +'compare shape' + cat + conv(含droupout); out = conv"""
- def __init__(self, in_channels, out_channels, dropout_p, kernel_size = 3,
- padding_size = 1, dilation_size = 1):
- super(UpBlock3D, self).__init__()
- self.up = nn.Upsample(scale_factor=2, mode='trilinear')
- self.conv = ConvBlock3D(in_channels + out_channels, out_channels, dropout_p, kernel_size,
- padding_size, dilation_size)
-
- def forward(self, x1, x2):
- x1 = self.up(x1)
- x = torch.cat([x1, x2], dim=1)
- return self.conv(x)
-
-class Encoder(nn.Module):
- def __init__(self, params):
- super(Encoder, self).__init__()
- self.params = params
- in_chns = self.params['in_chns']
- ft_chns = self.params['feature_chns']
- dropout = self.params['dropout']
- # init_type = self.params['init_type']
-
- # self.in_channels = self.params['in_chns']
- # self.feature_scale = self.params['feature_scale']
- # self.is_batchnorm = self.params['is_batchnorm'] # 默认True,IN
- # self.dropout_p = self.params['dropout'] #[0.05, 0.1, 0.2, 0.3, 0.5]
- # self.init_type = self.params['init_type'] #select mode: kaiming (default), xavier, normal, orthogonal
-
-
- # filters = [64, 128, 256, 512, 1024]
- # filters = [int(x / self.feature_scale) for x in filters]
- self.conv1 = ConvBlock3D(in_chns, ft_chns[0], dropout[0])
- self.conv2 = ConvBlock3D(ft_chns[0], ft_chns[1], dropout[1])
- self.conv3 = ConvBlock3D(ft_chns[1], ft_chns[2], dropout[2])
- self.conv4 = ConvBlock3D(ft_chns[2], ft_chns[3], dropout[3])
- self.conv5 = ConvBlock3D(ft_chns[3], ft_chns[4], dropout[4])
- self.maxpool1 = nn.MaxPool3d(kernel_size=2)
- self.maxpool2 = nn.MaxPool3d(kernel_size=2)
- self.maxpool3 = nn.MaxPool3d(kernel_size=2)
- self.maxpool4 = nn.MaxPool3d(kernel_size=2)
-
-
- # self.conv1 = ConvBlock3d(self.in_channels, filters[0], self.dropout_p[0], self.is_batchnorm, kernel_size=(
- # 3, 3, 3), padding_size=(1, 1, 1))
- # self.maxpool1 = nn.MaxPool3d(kernel_size=(2, 2, 2))
-
- # self.conv2 = ConvBlock3d(filters[0], filters[1], self.dropout_p[1], self.is_batchnorm, kernel_size=(
- # 3, 3, 3), padding_size=(1, 1, 1))
- # self.maxpool2 = nn.MaxPool3d(kernel_size=(2, 2, 2))
-
- # self.conv3 = ConvBlock3d(filters[1], filters[2], self.dropout_p[2], self.is_batchnorm, kernel_size=(
- # 3, 3, 3), padding_size=(1, 1, 1))
- # self.maxpool3 = nn.MaxPool3d(kernel_size=(2, 2, 2))
-
- # self.conv4 = ConvBlock3d(filters[2], filters[3], self.dropout_p[3], self.is_batchnorm, kernel_size=(
- # 3, 3, 3), padding_size=(1, 1, 1))
- # self.maxpool4 = nn.MaxPool3d(kernel_size=(2, 2, 2))
-
- # self.center = ConvBlock3d(filters[3], filters[4], self.dropout_p[4], self.is_batchnorm, kernel_size=(
- # 3, 3, 3), padding_size=(1, 1, 1))
-
- # initialise weights
- # for m in self.modules(): #kaiming initialization
- # if isinstance(m, nn.Conv3d):
- # init_weights(m, init_type = init_type)
- # elif isinstance(m, nn.BatchNorm3d):
- # init_weights(m, init_type = init_type)
- self.apply(self.init_weight)
-
- def init_weight(self, m):
- if(isinstance(m, nn.Linear) or isinstance(m, nn.Conv3d)):
- nn.init.kaiming_normal_(m.weight.data, a=0, mode='fan_in')
-
- def forward(self, inputs):
- x0 = self.conv1(inputs)
- x1 = self.conv2(self.maxpool1(x0))
- x2 = self.conv3(self.maxpool2(x1))
- x3 = self.conv4(self.maxpool3(x2))
- x4 = self.conv5(self.maxpool4(x3))
- return [x0, x1, x2, x3, x4]
-
-def Dropout_random(x):
- dropout_p = round(random.uniform(0.2, 0.5),2)
- x = torch.nn.functional.dropout3d(x, dropout_p)
- return x
-
-
-def FeatureDropout_3D(x):
- attention = torch.mean(x, dim=1, keepdim=True)
- max_val, _ = torch.max(attention.view(
- x.size(0), -1), dim=1, keepdim=True)
- threshold = max_val * np.random.uniform(0.7, 0.9)
- threshold = threshold.view(x.size(0), 1, 1, 1, 1).expand_as(attention)
- drop_mask = (attention < threshold).float()
- x = x.mul(drop_mask)
- return x
-
-class Decoder(nn.Module):
- def __init__(self, params):
- super(Decoder, self).__init__()
- self.params = params
-
- ft_chns = self.params['feature_chns']
- n_class = self.params['class_num']
- # self.feature_scale = self.params['feature_scale']
- # self.is_batchnorm = self.params['is_batchnorm']
-
- padding_size = self.params['dilation']
- # self.params['padding_size'] #3,1,6
- dilation = self.params['dilation'] #3,1,6
- dropout_p = self.params['dropout'] #[0.05, 0.1, 0.2, 0.3, 0.5]
-
- # filters = self.params['feature_chns']
- self.up4 = UpBlock3D(ft_chns[4], ft_chns[3], dropout_p[3], kernel_size=3,
- padding_size=1, dilation_size=1)
- self.up3 = UpBlock3D(ft_chns[3], ft_chns[2], dropout_p[2], kernel_size=3,
- padding_size=padding_size, dilation_size=dilation)
- self.up2 = UpBlock3D(ft_chns[2], ft_chns[1], dropout_p[1], kernel_size=3,
- padding_size=padding_size, dilation_size=dilation)
- self.up1 = UpBlock3D(ft_chns[1], ft_chns[0], dropout_p[0], kernel_size=3,
- padding_size=padding_size, dilation_size=dilation)
- # self.up_concat4 = Unet_Upblock3d(filters[4], filters[3], self.dropout_p[3], self.is_batchnorm, padding_size = self.padding_size, \
- # dilation = self.dilation) #UnetUp3_CT: up + cat + conv
- # self.up_concat3 = Unet_Upblock3d(filters[3], filters[2], self.dropout_p[2], self.is_batchnorm, padding_size = self.padding_size, \
- # dilation = self.dilation)
- # self.up_concat2 = Unet_Upblock3d(filters[2], filters[1], self.dropout_p[1], self.is_batchnorm, padding_size = self.padding_size, \
- # dilation = self.dilation)
- # self.up_concat1 = Unet_Upblock3d(filters[1], filters[0], self.dropout_p[0], self.is_batchnorm, padding_size = self.padding_size, \
- # dilation = self.dilation) # filters[1],[0]分别代表in, out,
-
- self.out_conv = nn.Conv3d(ft_chns[0], n_class, kernel_size = 1)
- self.out_conv2 = nn.Conv3d(ft_chns[1], n_class, kernel_size = 1)
- self.out_conv3 = nn.Conv3d(ft_chns[2], n_class, kernel_size = 1)
- self.out_conv4 = nn.Conv3d(ft_chns[3], n_class, kernel_size = 1)
-
- # for m in self.modules():
- # print(m, type(m))
- # if isinstance(m, nn.Conv3d):
- # init_weights(m, init_type=init_type)
- # elif isinstance(m, nn.BatchNorm3d):
- # init_weights(m, init_type=init_type)
- self.apply(self.init_weight)
-
- def init_weight(self, m):
- init_type = self.params['init_type'] #select mode: kaiming, xavier, normal, orthogonal。默认kaiming
- if(isinstance(m, nn.Linear) or isinstance(m, nn.Conv3d)):
- if(init_type == "kaiming"):
- nn.init.kaiming_normal_(m.weight.data, a=0, mode='fan_in')
- print("this layer is ininialized by kaiming", m)
- elif(init_type == "xavier"):
- nn.init.xavier_normal_(m.weight.data, gain=1)
- print("this layer is ininialized by xavier", m)
- else:
- nn.init.normal_(m.weight, 0.0, 0.02)
- print("this layer is ininialized by normal", m)
-
-
- def forward(self, x):
- x0, x1, x2, x3, x4 = x
- x3_dec = self.up4(x4, x3)
- x2_dec = self.up3(x3_dec, x2)
- x1_dec = self.up2(x2_dec, x1)
- x0_dec = self.up1(x1_dec, x0)
- output = self.out_conv(x0_dec)
- output_2 = self.out_conv2(x1_dec)
- output_3 = self.out_conv3(x2_dec)
- output_4 = self.out_conv4(x3_dec)
-
- return output, output_2, output_3, output_4
-
-class TDNet3D(nn.Module):
- def __init__(self, params):
- super(TDNet3D, self).__init__()
-
- params = self.get_default_parameters(params)
- init_types = params['init_types']
- dilation_rates = params['dilation_rates']
- for p in params:
- print(p, params[p])
-
- params_decoder = copy.deepcopy(params)
- params_decoder['init_type'] = init_types[0]
- params_decoder['dilation'] = dilation_rates[0]
-
- params_deaux1 = copy.deepcopy(params)
- params_deaux1['init_type'] = init_types[1]
- params_deaux1['dilation'] = dilation_rates[1]
-
- params_deaux2 = copy.deepcopy(params)
- params_deaux2['init_type'] = init_types[2]
- params_deaux2['dilation'] = dilation_rates[2]
-
- self.encoder = Encoder(params)
- self.main_decoder = Decoder(params_decoder)
- self.aux_decoder1 = Decoder(params_deaux1)
- self.aux_decoder2 = Decoder(params_deaux2)
-
- def get_default_parameters(self, params):
- default_param = {
- 'feature_chns': [16, 32, 64, 128, 256],
- 'dropout': [0.00, 0.1, 0.2, 0.3, 0.5],
- 'up_mode': 2,
- 'norm_type': 'batch_norm',
- 'init_types': ['kaiming', 'xavier', 'normal'],
- 'dilation_rates': [1,1,1]}
- for key in default_param:
- params[key] = params.get(key, default_param[key])
- for key in params:
- logging.info("{0:} = {1:}".format(key, params[key]))
- return params
-
- def forward(self, x):
- # pLS论文里提到:
- # We added the dropout layer (ratio=0.5) before each
- # conv-block of the auxiliary decoder to introduce perturbations
- """
- here, we added random dropout before each conv-block of the auxiliary decoder"""
- features = self.encoder(x)
- main_seg, main_embedding1, main_embedding2, main_embedding3 = self.main_decoder(features)
-
- aux1_feature = [Dropout_random(i) for i in features]
- aux2_feature = [FeatureDropout_3D(i) for i in features]
-
- aux1_seg, aux1_embedding1, aux1_embedding2, aux1_embedding3 = self.aux_decoder1(aux1_feature)
- aux2_seg, aux2_embedding1, aux2_embedding2, aux2_embedding3 = self.aux_decoder2(aux2_feature)
-
- if self.training:
- return [main_seg, aux1_seg, aux2_seg], [main_embedding1, aux1_embedding1, aux2_embedding1],\
- [main_embedding2, aux1_embedding2, aux2_embedding2], [main_embedding3, aux1_embedding3, aux2_embedding3]
- else:
- return main_seg, aux1_seg, aux2_seg
-
\ No newline at end of file
diff --git a/pymic/net/transformer/__init__.py b/pymic/net/transformer/__init__.py
deleted file mode 100644
index e69de29..0000000
diff --git a/pymic/net/transformer/swinunet.py b/pymic/net/transformer/swinunet.py
deleted file mode 100644
index eb09e04..0000000
--- a/pymic/net/transformer/swinunet.py
+++ /dev/null
@@ -1,124 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-code adapted from: https://github.com/HuCaoFighting/Swin-Unet
-
-"""
-from __future__ import print_function, division
-
-import copy
-import numpy as np
-import torch
-import torch.nn as nn
-
-from pymic.net.transformer.swinunet_sys import SwinTransformerSys
-
-class SwinUNet(nn.Module):
- """
- Implementatin of Swin-UNet.
-
- * Reference: Hu Cao, Yueyue Wang et al:
- Swin-Unet: Unet-Like Pure Transformer for Medical Image Segmentation.
- `ECCV 2022 Workshops. `_
-
- Note that the input channel can only be 1 or 3, and the input image size should be 224x224.
- Parameters are given in the `params` dictionary, and should include the
- following fields:
-
- :param img_size: (tuple) The input image size, should be [224, 224].
- :param class_num: (int) The class number for segmentation task.
- """
- def __init__(self, params):
- super(SwinUNet, self).__init__()
- img_size = params['img_size']
- if(isinstance(img_size, tuple) or isinstance(img_size, list)):
- img_size = img_size[0]
- self.num_classes = params['class_num']
- self.swin_unet = SwinTransformerSys(img_size = img_size, num_classes=self.num_classes)
- # self.swin_unet = SwinTransformerSys(img_size=config.DATA.IMG_SIZE,
- # patch_size=config.MODEL.SWIN.PATCH_SIZE,
- # in_chans=config.MODEL.SWIN.IN_CHANS,
- # num_classes=self.num_classes,
- # embed_dim=config.MODEL.SWIN.EMBED_DIM,
- # depths=config.MODEL.SWIN.DEPTHS,
- # num_heads=config.MODEL.SWIN.NUM_HEADS,
- # window_size=config.MODEL.SWIN.WINDOW_SIZE,
- # mlp_ratio=config.MODEL.SWIN.MLP_RATIO,
- # qkv_bias=config.MODEL.SWIN.QKV_BIAS,
- # qk_scale=config.MODEL.SWIN.QK_SCALE,
- # drop_rate=config.MODEL.DROP_RATE,
- # drop_path_rate=config.MODEL.DROP_PATH_RATE,
- # ape=config.MODEL.SWIN.APE,
- # patch_norm=config.MODEL.SWIN.PATCH_NORM,
- # use_checkpoint=config.TRAIN.USE_CHECKPOINT)
-
- def forward(self, x):
- x_shape = list(x.shape)
- if(len(x_shape) == 5):
- [N, C, D, H, W] = x_shape
- new_shape = [N*D, C, H, W]
- x = torch.transpose(x, 1, 2)
- x = torch.reshape(x, new_shape)
-
- if x.size()[1] == 1:
- x = x.repeat(1,3,1,1)
- logits = self.swin_unet(x)
-
- if(len(x_shape) == 5):
- new_shape = [N, D] + list(logits.shape)[1:]
- logits = torch.reshape(logits, new_shape)
- logits = torch.transpose(logits, 1, 2)
-
- return logits
-
- def load_from(self, config):
- pretrained_path = config.MODEL.PRETRAIN_CKPT
- if pretrained_path is not None:
- print("pretrained_path:{}".format(pretrained_path))
- device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
- pretrained_dict = torch.load(pretrained_path, map_location=device)
- if "model" not in pretrained_dict:
- print("---start load pretrained modle by splitting---")
- pretrained_dict = {k[17:]:v for k,v in pretrained_dict.items()}
- for k in list(pretrained_dict.keys()):
- if "output" in k:
- print("delete key:{}".format(k))
- del pretrained_dict[k]
- msg = self.swin_unet.load_state_dict(pretrained_dict,strict=False)
- # print(msg)
- return
- pretrained_dict = pretrained_dict['model']
- print("---start load pretrained modle of swin encoder---")
-
- model_dict = self.swin_unet.state_dict()
- full_dict = copy.deepcopy(pretrained_dict)
- for k, v in pretrained_dict.items():
- if "layers." in k:
- current_layer_num = 3-int(k[7:8])
- current_k = "layers_up." + str(current_layer_num) + k[8:]
- full_dict.update({current_k:v})
- for k in list(full_dict.keys()):
- if k in model_dict:
- if full_dict[k].shape != model_dict[k].shape:
- print("delete:{};shape pretrain:{};shape model:{}".format(k,v.shape,model_dict[k].shape))
- del full_dict[k]
-
- msg = self.swin_unet.load_state_dict(full_dict, strict=False)
- # print(msg)
- else:
- print("none pretrain")
-
-
-if __name__ == "__main__":
- params = {'img_size': [224, 224],
- 'class_num': 2}
- net = SwinUNet(params)
- net.double()
-
- x = np.random.rand(4, 3, 224, 224)
- xt = torch.from_numpy(x)
- xt = torch.tensor(xt)
-
- y = net(xt)
- print(len(y.size()))
- y = y.detach().numpy()
- print(y.shape)
\ No newline at end of file
diff --git a/pymic/net/transformer/swinunet_sys.py b/pymic/net/transformer/swinunet_sys.py
deleted file mode 100644
index a6e3552..0000000
--- a/pymic/net/transformer/swinunet_sys.py
+++ /dev/null
@@ -1,749 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-code adapted from: https://github.com/HuCaoFighting/Swin-Unet
-
-"""
-from __future__ import print_function, division
-
-import torch
-import torch.nn as nn
-import torch.utils.checkpoint as checkpoint
-from einops import rearrange
-from timm.models.layers import DropPath, to_2tuple, trunc_normal_
-
-
-class Mlp(nn.Module):
- def __init__(self, in_features, hidden_features=None, out_features=None, act_layer=nn.GELU, drop=0.):
- super().__init__()
- out_features = out_features or in_features
- hidden_features = hidden_features or in_features
- self.fc1 = nn.Linear(in_features, hidden_features)
- self.act = act_layer()
- self.fc2 = nn.Linear(hidden_features, out_features)
- self.drop = nn.Dropout(drop)
-
- def forward(self, x):
- x = self.fc1(x)
- x = self.act(x)
- x = self.drop(x)
- x = self.fc2(x)
- x = self.drop(x)
- return x
-
-
-def window_partition(x, window_size):
- """
- Args:
- x: (B, H, W, C)
- window_size (int): window size
- Returns:
- windows: (num_windows*B, window_size, window_size, C)
- """
- B, H, W, C = x.shape
- x = x.view(B, H // window_size, window_size, W // window_size, window_size, C)
- windows = x.permute(0, 1, 3, 2, 4, 5).contiguous().view(-1, window_size, window_size, C)
- return windows
-
-
-def window_reverse(windows, window_size, H, W):
- """
- Args:
- windows: (num_windows*B, window_size, window_size, C)
- window_size (int): Window size
- H (int): Height of image
- W (int): Width of image
- Returns:
- x: (B, H, W, C)
- """
- B = int(windows.shape[0] / (H * W / window_size / window_size))
- x = windows.view(B, H // window_size, W // window_size, window_size, window_size, -1)
- x = x.permute(0, 1, 3, 2, 4, 5).contiguous().view(B, H, W, -1)
- return x
-
-
-class WindowAttention(nn.Module):
- r""" Window based multi-head self attention (W-MSA) module with relative position bias.
- It supports both of shifted and non-shifted window.
- Args:
- dim (int): Number of input channels.
- window_size (tuple[int]): The height and width of the window.
- num_heads (int): Number of attention heads.
- qkv_bias (bool, optional): If True, add a learnable bias to query, key, value. Default: True
- qk_scale (float | None, optional): Override default qk scale of head_dim ** -0.5 if set
- attn_drop (float, optional): Dropout ratio of attention weight. Default: 0.0
- proj_drop (float, optional): Dropout ratio of output. Default: 0.0
- """
-
- def __init__(self, dim, window_size, num_heads, qkv_bias=True, qk_scale=None, attn_drop=0., proj_drop=0.):
-
- super().__init__()
- self.dim = dim
- self.window_size = window_size # Wh, Ww
- self.num_heads = num_heads
- head_dim = dim // num_heads
- self.scale = qk_scale or head_dim ** -0.5
-
- # define a parameter table of relative position bias
- self.relative_position_bias_table = nn.Parameter(
- torch.zeros((2 * window_size[0] - 1) * (2 * window_size[1] - 1), num_heads)) # 2*Wh-1 * 2*Ww-1, nH
-
- # get pair-wise relative position index for each token inside the window
- coords_h = torch.arange(self.window_size[0])
- coords_w = torch.arange(self.window_size[1])
- coords = torch.stack(torch.meshgrid([coords_h, coords_w])) # 2, Wh, Ww
- coords_flatten = torch.flatten(coords, 1) # 2, Wh*Ww
- relative_coords = coords_flatten[:, :, None] - coords_flatten[:, None, :] # 2, Wh*Ww, Wh*Ww
- relative_coords = relative_coords.permute(1, 2, 0).contiguous() # Wh*Ww, Wh*Ww, 2
- relative_coords[:, :, 0] += self.window_size[0] - 1 # shift to start from 0
- relative_coords[:, :, 1] += self.window_size[1] - 1
- relative_coords[:, :, 0] *= 2 * self.window_size[1] - 1
- relative_position_index = relative_coords.sum(-1) # Wh*Ww, Wh*Ww
- self.register_buffer("relative_position_index", relative_position_index)
-
- self.qkv = nn.Linear(dim, dim * 3, bias=qkv_bias)
- self.attn_drop = nn.Dropout(attn_drop)
- self.proj = nn.Linear(dim, dim)
- self.proj_drop = nn.Dropout(proj_drop)
-
- trunc_normal_(self.relative_position_bias_table, std=.02)
- self.softmax = nn.Softmax(dim=-1)
-
- def forward(self, x, mask=None):
- """
- Args:
- x: input features with shape of (num_windows*B, N, C)
- mask: (0/-inf) mask with shape of (num_windows, Wh*Ww, Wh*Ww) or None
- """
- B_, N, C = x.shape
- qkv = self.qkv(x).reshape(B_, N, 3, self.num_heads, C // self.num_heads).permute(2, 0, 3, 1, 4)
- q, k, v = qkv[0], qkv[1], qkv[2] # make torchscript happy (cannot use tensor as tuple)
-
- q = q * self.scale
- attn = (q @ k.transpose(-2, -1))
-
- relative_position_bias = self.relative_position_bias_table[self.relative_position_index.view(-1)].view(
- self.window_size[0] * self.window_size[1], self.window_size[0] * self.window_size[1], -1) # Wh*Ww,Wh*Ww,nH
- relative_position_bias = relative_position_bias.permute(2, 0, 1).contiguous() # nH, Wh*Ww, Wh*Ww
- attn = attn + relative_position_bias.unsqueeze(0)
-
- if mask is not None:
- nW = mask.shape[0]
- attn = attn.view(B_ // nW, nW, self.num_heads, N, N) + mask.unsqueeze(1).unsqueeze(0)
- attn = attn.view(-1, self.num_heads, N, N)
- attn = self.softmax(attn)
- else:
- attn = self.softmax(attn)
-
- attn = self.attn_drop(attn)
-
- x = (attn @ v).transpose(1, 2).reshape(B_, N, C)
- x = self.proj(x)
- x = self.proj_drop(x)
- return x
-
- def extra_repr(self) -> str:
- return f'dim={self.dim}, window_size={self.window_size}, num_heads={self.num_heads}'
-
- def flops(self, N):
- # calculate flops for 1 window with token length of N
- flops = 0
- # qkv = self.qkv(x)
- flops += N * self.dim * 3 * self.dim
- # attn = (q @ k.transpose(-2, -1))
- flops += self.num_heads * N * (self.dim // self.num_heads) * N
- # x = (attn @ v)
- flops += self.num_heads * N * N * (self.dim // self.num_heads)
- # x = self.proj(x)
- flops += N * self.dim * self.dim
- return flops
-
-
-class SwinTransformerBlock(nn.Module):
- r""" Swin Transformer Block.
- Args:
- dim (int): Number of input channels.
- input_resolution (tuple[int]): Input resulotion.
- num_heads (int): Number of attention heads.
- window_size (int): Window size.
- shift_size (int): Shift size for SW-MSA.
- mlp_ratio (float): Ratio of mlp hidden dim to embedding dim.
- qkv_bias (bool, optional): If True, add a learnable bias to query, key, value. Default: True
- qk_scale (float | None, optional): Override default qk scale of head_dim ** -0.5 if set.
- drop (float, optional): Dropout rate. Default: 0.0
- attn_drop (float, optional): Attention dropout rate. Default: 0.0
- drop_path (float, optional): Stochastic depth rate. Default: 0.0
- act_layer (nn.Module, optional): Activation layer. Default: nn.GELU
- norm_layer (nn.Module, optional): Normalization layer. Default: nn.LayerNorm
- """
-
- def __init__(self, dim, input_resolution, num_heads, window_size=7, shift_size=0,
- mlp_ratio=4., qkv_bias=True, qk_scale=None, drop=0., attn_drop=0., drop_path=0.,
- act_layer=nn.GELU, norm_layer=nn.LayerNorm):
- super().__init__()
- self.dim = dim
- self.input_resolution = input_resolution
- self.num_heads = num_heads
- self.window_size = window_size
- self.shift_size = shift_size
- self.mlp_ratio = mlp_ratio
- if min(self.input_resolution) <= self.window_size:
- # if window size is larger than input resolution, we don't partition windows
- self.shift_size = 0
- self.window_size = min(self.input_resolution)
- assert 0 <= self.shift_size < self.window_size, "shift_size must in 0-window_size"
-
- self.norm1 = norm_layer(dim)
- self.attn = WindowAttention(
- dim, window_size=to_2tuple(self.window_size), num_heads=num_heads,
- qkv_bias=qkv_bias, qk_scale=qk_scale, attn_drop=attn_drop, proj_drop=drop)
-
- self.drop_path = DropPath(drop_path) if drop_path > 0. else nn.Identity()
- self.norm2 = norm_layer(dim)
- mlp_hidden_dim = int(dim * mlp_ratio)
- self.mlp = Mlp(in_features=dim, hidden_features=mlp_hidden_dim, act_layer=act_layer, drop=drop)
-
- if self.shift_size > 0:
- # calculate attention mask for SW-MSA
- H, W = self.input_resolution
- img_mask = torch.zeros((1, H, W, 1)) # 1 H W 1
- h_slices = (slice(0, -self.window_size),
- slice(-self.window_size, -self.shift_size),
- slice(-self.shift_size, None))
- w_slices = (slice(0, -self.window_size),
- slice(-self.window_size, -self.shift_size),
- slice(-self.shift_size, None))
- cnt = 0
- for h in h_slices:
- for w in w_slices:
- img_mask[:, h, w, :] = cnt
- cnt += 1
-
- mask_windows = window_partition(img_mask, self.window_size) # nW, window_size, window_size, 1
- mask_windows = mask_windows.view(-1, self.window_size * self.window_size)
- attn_mask = mask_windows.unsqueeze(1) - mask_windows.unsqueeze(2)
- attn_mask = attn_mask.masked_fill(attn_mask != 0, float(-100.0)).masked_fill(attn_mask == 0, float(0.0))
- else:
- attn_mask = None
-
- self.register_buffer("attn_mask", attn_mask)
-
- def forward(self, x):
- H, W = self.input_resolution
- B, L, C = x.shape
- assert L == H * W, "input feature has wrong size"
-
- shortcut = x
- x = self.norm1(x)
- x = x.view(B, H, W, C)
-
- # cyclic shift
- if self.shift_size > 0:
- shifted_x = torch.roll(x, shifts=(-self.shift_size, -self.shift_size), dims=(1, 2))
- else:
- shifted_x = x
-
- # partition windows
- x_windows = window_partition(shifted_x, self.window_size) # nW*B, window_size, window_size, C
- x_windows = x_windows.view(-1, self.window_size * self.window_size, C) # nW*B, window_size*window_size, C
-
- # W-MSA/SW-MSA
- attn_windows = self.attn(x_windows, mask=self.attn_mask) # nW*B, window_size*window_size, C
-
- # merge windows
- attn_windows = attn_windows.view(-1, self.window_size, self.window_size, C)
- shifted_x = window_reverse(attn_windows, self.window_size, H, W) # B H' W' C
-
- # reverse cyclic shift
- if self.shift_size > 0:
- x = torch.roll(shifted_x, shifts=(self.shift_size, self.shift_size), dims=(1, 2))
- else:
- x = shifted_x
- x = x.view(B, H * W, C)
-
- # FFN
- x = shortcut + self.drop_path(x)
- x = x + self.drop_path(self.mlp(self.norm2(x)))
-
- return x
-
- def extra_repr(self) -> str:
- return f"dim={self.dim}, input_resolution={self.input_resolution}, num_heads={self.num_heads}, " \
- f"window_size={self.window_size}, shift_size={self.shift_size}, mlp_ratio={self.mlp_ratio}"
-
- def flops(self):
- flops = 0
- H, W = self.input_resolution
- # norm1
- flops += self.dim * H * W
- # W-MSA/SW-MSA
- nW = H * W / self.window_size / self.window_size
- flops += nW * self.attn.flops(self.window_size * self.window_size)
- # mlp
- flops += 2 * H * W * self.dim * self.dim * self.mlp_ratio
- # norm2
- flops += self.dim * H * W
- return flops
-
-
-class PatchMerging(nn.Module):
- r""" Patch Merging Layer.
- Args:
- input_resolution (tuple[int]): Resolution of input feature.
- dim (int): Number of input channels.
- norm_layer (nn.Module, optional): Normalization layer. Default: nn.LayerNorm
- """
-
- def __init__(self, input_resolution, dim, norm_layer=nn.LayerNorm):
- super().__init__()
- self.input_resolution = input_resolution
- self.dim = dim
- self.reduction = nn.Linear(4 * dim, 2 * dim, bias=False)
- self.norm = norm_layer(4 * dim)
-
- def forward(self, x):
- """
- x: B, H*W, C
- """
- H, W = self.input_resolution
- B, L, C = x.shape
- assert L == H * W, "input feature has wrong size"
- assert H % 2 == 0 and W % 2 == 0, f"x size ({H}*{W}) are not even."
-
- x = x.view(B, H, W, C)
-
- x0 = x[:, 0::2, 0::2, :] # B H/2 W/2 C
- x1 = x[:, 1::2, 0::2, :] # B H/2 W/2 C
- x2 = x[:, 0::2, 1::2, :] # B H/2 W/2 C
- x3 = x[:, 1::2, 1::2, :] # B H/2 W/2 C
- x = torch.cat([x0, x1, x2, x3], -1) # B H/2 W/2 4*C
- x = x.view(B, -1, 4 * C) # B H/2*W/2 4*C
-
- x = self.norm(x)
- x = self.reduction(x)
-
- return x
-
- def extra_repr(self) -> str:
- return f"input_resolution={self.input_resolution}, dim={self.dim}"
-
- def flops(self):
- H, W = self.input_resolution
- flops = H * W * self.dim
- flops += (H // 2) * (W // 2) * 4 * self.dim * 2 * self.dim
- return flops
-
-class PatchExpand(nn.Module):
- def __init__(self, input_resolution, dim, dim_scale=2, norm_layer=nn.LayerNorm):
- super().__init__()
- self.input_resolution = input_resolution
- self.dim = dim
- self.expand = nn.Linear(dim, 2*dim, bias=False) if dim_scale==2 else nn.Identity()
- self.norm = norm_layer(dim // dim_scale)
-
- def forward(self, x):
- """
- x: B, H*W, C
- """
- H, W = self.input_resolution
- x = self.expand(x)
- B, L, C = x.shape
- assert L == H * W, "input feature has wrong size"
-
- x = x.view(B, H, W, C)
- x = rearrange(x, 'b h w (p1 p2 c)-> b (h p1) (w p2) c', p1=2, p2=2, c=C//4)
- x = x.view(B,-1,C//4)
- x= self.norm(x)
-
- return x
-
-class FinalPatchExpand_X4(nn.Module):
- def __init__(self, input_resolution, dim, dim_scale=4, norm_layer=nn.LayerNorm):
- super().__init__()
- self.input_resolution = input_resolution
- self.dim = dim
- self.dim_scale = dim_scale
- self.expand = nn.Linear(dim, 16*dim, bias=False)
- self.output_dim = dim
- self.norm = norm_layer(self.output_dim)
-
- def forward(self, x):
- """
- x: B, H*W, C
- """
- H, W = self.input_resolution
- x = self.expand(x)
- B, L, C = x.shape
- assert L == H * W, "input feature has wrong size"
-
- x = x.view(B, H, W, C)
- x = rearrange(x, 'b h w (p1 p2 c)-> b (h p1) (w p2) c', p1=self.dim_scale, p2=self.dim_scale, c=C//(self.dim_scale**2))
- x = x.view(B,-1,self.output_dim)
- x= self.norm(x)
-
- return x
-
-class BasicLayer(nn.Module):
- """ A basic Swin Transformer layer for one stage.
- Args:
- dim (int): Number of input channels.
- input_resolution (tuple[int]): Input resolution.
- depth (int): Number of blocks.
- num_heads (int): Number of attention heads.
- window_size (int): Local window size.
- mlp_ratio (float): Ratio of mlp hidden dim to embedding dim.
- qkv_bias (bool, optional): If True, add a learnable bias to query, key, value. Default: True
- qk_scale (float | None, optional): Override default qk scale of head_dim ** -0.5 if set.
- drop (float, optional): Dropout rate. Default: 0.0
- attn_drop (float, optional): Attention dropout rate. Default: 0.0
- drop_path (float | tuple[float], optional): Stochastic depth rate. Default: 0.0
- norm_layer (nn.Module, optional): Normalization layer. Default: nn.LayerNorm
- downsample (nn.Module | None, optional): Downsample layer at the end of the layer. Default: None
- use_checkpoint (bool): Whether to use checkpointing to save memory. Default: False.
- """
-
- def __init__(self, dim, input_resolution, depth, num_heads, window_size,
- mlp_ratio=4., qkv_bias=True, qk_scale=None, drop=0., attn_drop=0.,
- drop_path=0., norm_layer=nn.LayerNorm, downsample=None, use_checkpoint=False):
-
- super().__init__()
- self.dim = dim
- self.input_resolution = input_resolution
- self.depth = depth
- self.use_checkpoint = use_checkpoint
-
- # build blocks
- self.blocks = nn.ModuleList([
- SwinTransformerBlock(dim=dim, input_resolution=input_resolution,
- num_heads=num_heads, window_size=window_size,
- shift_size=0 if (i % 2 == 0) else window_size // 2,
- mlp_ratio=mlp_ratio,
- qkv_bias=qkv_bias, qk_scale=qk_scale,
- drop=drop, attn_drop=attn_drop,
- drop_path=drop_path[i] if isinstance(drop_path, list) else drop_path,
- norm_layer=norm_layer)
- for i in range(depth)])
-
- # patch merging layer
- if downsample is not None:
- self.downsample = downsample(input_resolution, dim=dim, norm_layer=norm_layer)
- else:
- self.downsample = None
-
- def forward(self, x):
- for blk in self.blocks:
- if self.use_checkpoint:
- x = checkpoint.checkpoint(blk, x)
- else:
- x = blk(x)
- if self.downsample is not None:
- x = self.downsample(x)
- return x
-
- def extra_repr(self) -> str:
- return f"dim={self.dim}, input_resolution={self.input_resolution}, depth={self.depth}"
-
- def flops(self):
- flops = 0
- for blk in self.blocks:
- flops += blk.flops()
- if self.downsample is not None:
- flops += self.downsample.flops()
- return flops
-
-class BasicLayer_up(nn.Module):
- """ A basic Swin Transformer layer for one stage.
- Args:
- dim (int): Number of input channels.
- input_resolution (tuple[int]): Input resolution.
- depth (int): Number of blocks.
- num_heads (int): Number of attention heads.
- window_size (int): Local window size.
- mlp_ratio (float): Ratio of mlp hidden dim to embedding dim.
- qkv_bias (bool, optional): If True, add a learnable bias to query, key, value. Default: True
- qk_scale (float | None, optional): Override default qk scale of head_dim ** -0.5 if set.
- drop (float, optional): Dropout rate. Default: 0.0
- attn_drop (float, optional): Attention dropout rate. Default: 0.0
- drop_path (float | tuple[float], optional): Stochastic depth rate. Default: 0.0
- norm_layer (nn.Module, optional): Normalization layer. Default: nn.LayerNorm
- downsample (nn.Module | None, optional): Downsample layer at the end of the layer. Default: None
- use_checkpoint (bool): Whether to use checkpointing to save memory. Default: False.
- """
-
- def __init__(self, dim, input_resolution, depth, num_heads, window_size,
- mlp_ratio=4., qkv_bias=True, qk_scale=None, drop=0., attn_drop=0.,
- drop_path=0., norm_layer=nn.LayerNorm, upsample=None, use_checkpoint=False):
-
- super().__init__()
- self.dim = dim
- self.input_resolution = input_resolution
- self.depth = depth
- self.use_checkpoint = use_checkpoint
-
- # build blocks
- self.blocks = nn.ModuleList([
- SwinTransformerBlock(dim=dim, input_resolution=input_resolution,
- num_heads=num_heads, window_size=window_size,
- shift_size=0 if (i % 2 == 0) else window_size // 2,
- mlp_ratio=mlp_ratio,
- qkv_bias=qkv_bias, qk_scale=qk_scale,
- drop=drop, attn_drop=attn_drop,
- drop_path=drop_path[i] if isinstance(drop_path, list) else drop_path,
- norm_layer=norm_layer)
- for i in range(depth)])
-
- # patch merging layer
- if upsample is not None:
- self.upsample = PatchExpand(input_resolution, dim=dim, dim_scale=2, norm_layer=norm_layer)
- else:
- self.upsample = None
-
- def forward(self, x):
- for blk in self.blocks:
- if self.use_checkpoint:
- x = checkpoint.checkpoint(blk, x)
- else:
- x = blk(x)
- if self.upsample is not None:
- x = self.upsample(x)
- return x
-
-class PatchEmbed(nn.Module):
- r""" Image to Patch Embedding
- Args:
- img_size (int): Image size. Default: 224.
- patch_size (int): Patch token size. Default: 4.
- in_chans (int): Number of input image channels. Default: 3.
- embed_dim (int): Number of linear projection output channels. Default: 96.
- norm_layer (nn.Module, optional): Normalization layer. Default: None
- """
-
- def __init__(self, img_size=224, patch_size=4, in_chans=3, embed_dim=96, norm_layer=None):
- super().__init__()
- img_size = to_2tuple(img_size)
- patch_size = to_2tuple(patch_size)
- patches_resolution = [img_size[0] // patch_size[0], img_size[1] // patch_size[1]]
- self.img_size = img_size
- self.patch_size = patch_size
- self.patches_resolution = patches_resolution
- self.num_patches = patches_resolution[0] * patches_resolution[1]
-
- self.in_chans = in_chans
- self.embed_dim = embed_dim
-
- self.proj = nn.Conv2d(in_chans, embed_dim, kernel_size=patch_size, stride=patch_size)
- if norm_layer is not None:
- self.norm = norm_layer(embed_dim)
- else:
- self.norm = None
-
- def forward(self, x):
- B, C, H, W = x.shape
- # FIXME look at relaxing size constraints
- assert H == self.img_size[0] and W == self.img_size[1], \
- f"Input image size ({H}*{W}) doesn't match model ({self.img_size[0]}*{self.img_size[1]})."
- x = self.proj(x).flatten(2).transpose(1, 2) # B Ph*Pw C
- if self.norm is not None:
- x = self.norm(x)
- return x
-
- def flops(self):
- Ho, Wo = self.patches_resolution
- flops = Ho * Wo * self.embed_dim * self.in_chans * (self.patch_size[0] * self.patch_size[1])
- if self.norm is not None:
- flops += Ho * Wo * self.embed_dim
- return flops
-
-
-class SwinTransformerSys(nn.Module):
- r""" Swin Transformer
- A PyTorch impl of : `Swin Transformer: Hierarchical Vision Transformer using Shifted Windows` -
- https://arxiv.org/pdf/2103.14030
- Args:
- img_size (int | tuple(int)): Input image size. Default 224
- patch_size (int | tuple(int)): Patch size. Default: 4
- in_chans (int): Number of input image channels. Default: 3
- num_classes (int): Number of classes for classification head. Default: 1000
- embed_dim (int): Patch embedding dimension. Default: 96
- depths (tuple(int)): Depth of each Swin Transformer layer.
- num_heads (tuple(int)): Number of attention heads in different layers.
- window_size (int): Window size. Default: 7
- mlp_ratio (float): Ratio of mlp hidden dim to embedding dim. Default: 4
- qkv_bias (bool): If True, add a learnable bias to query, key, value. Default: True
- qk_scale (float): Override default qk scale of head_dim ** -0.5 if set. Default: None
- drop_rate (float): Dropout rate. Default: 0
- attn_drop_rate (float): Attention dropout rate. Default: 0
- drop_path_rate (float): Stochastic depth rate. Default: 0.1
- norm_layer (nn.Module): Normalization layer. Default: nn.LayerNorm.
- ape (bool): If True, add absolute position embedding to the patch embedding. Default: False
- patch_norm (bool): If True, add normalization after patch embedding. Default: True
- use_checkpoint (bool): Whether to use checkpointing to save memory. Default: False
- """
-
- def __init__(self, img_size=224, patch_size=4, in_chans=3, num_classes=1000,
- embed_dim=96, depths=[2, 2, 2, 2], depths_decoder=[1, 2, 2, 2], num_heads=[3, 6, 12, 24],
- window_size=7, mlp_ratio=4., qkv_bias=True, qk_scale=None,
- drop_rate=0., attn_drop_rate=0., drop_path_rate=0.1,
- norm_layer=nn.LayerNorm, ape=False, patch_norm=True,
- use_checkpoint=False, final_upsample="expand_first", **kwargs):
- super().__init__()
-
- print("SwinTransformerSys expand initial----depths:{};depths_decoder:{};drop_path_rate:{};num_classes:{}".format(depths,
- depths_decoder,drop_path_rate,num_classes))
-
- self.num_classes = num_classes
- self.num_layers = len(depths)
- self.embed_dim = embed_dim
- self.ape = ape
- self.patch_norm = patch_norm
- self.num_features = int(embed_dim * 2 ** (self.num_layers - 1))
- self.num_features_up = int(embed_dim * 2)
- self.mlp_ratio = mlp_ratio
- self.final_upsample = final_upsample
-
- # split image into non-overlapping patches
- self.patch_embed = PatchEmbed(
- img_size=img_size, patch_size=patch_size, in_chans=in_chans, embed_dim=embed_dim,
- norm_layer=norm_layer if self.patch_norm else None)
- num_patches = self.patch_embed.num_patches
- patches_resolution = self.patch_embed.patches_resolution
- self.patches_resolution = patches_resolution
-
- # absolute position embedding
- if self.ape:
- self.absolute_pos_embed = nn.Parameter(torch.zeros(1, num_patches, embed_dim))
- trunc_normal_(self.absolute_pos_embed, std=.02)
-
- self.pos_drop = nn.Dropout(p=drop_rate)
-
- # stochastic depth
- dpr = [x.item() for x in torch.linspace(0, drop_path_rate, sum(depths))] # stochastic depth decay rule
-
- # build encoder and bottleneck layers
- self.layers = nn.ModuleList()
- for i_layer in range(self.num_layers):
- layer = BasicLayer(dim=int(embed_dim * 2 ** i_layer),
- input_resolution=(patches_resolution[0] // (2 ** i_layer),
- patches_resolution[1] // (2 ** i_layer)),
- depth=depths[i_layer],
- num_heads=num_heads[i_layer],
- window_size=window_size,
- mlp_ratio=self.mlp_ratio,
- qkv_bias=qkv_bias, qk_scale=qk_scale,
- drop=drop_rate, attn_drop=attn_drop_rate,
- drop_path=dpr[sum(depths[:i_layer]):sum(depths[:i_layer + 1])],
- norm_layer=norm_layer,
- downsample=PatchMerging if (i_layer < self.num_layers - 1) else None,
- use_checkpoint=use_checkpoint)
- self.layers.append(layer)
-
- # build decoder layers
- self.layers_up = nn.ModuleList()
- self.concat_back_dim = nn.ModuleList()
- for i_layer in range(self.num_layers):
- concat_linear = nn.Linear(2*int(embed_dim*2**(self.num_layers-1-i_layer)),
- int(embed_dim*2**(self.num_layers-1-i_layer))) if i_layer > 0 else nn.Identity()
- if i_layer ==0 :
- layer_up = PatchExpand(input_resolution=(patches_resolution[0] // (2 ** (self.num_layers-1-i_layer)),
- patches_resolution[1] // (2 ** (self.num_layers-1-i_layer))), dim=int(embed_dim * 2 ** (self.num_layers-1-i_layer)), dim_scale=2, norm_layer=norm_layer)
- else:
- layer_up = BasicLayer_up(dim=int(embed_dim * 2 ** (self.num_layers-1-i_layer)),
- input_resolution=(patches_resolution[0] // (2 ** (self.num_layers-1-i_layer)),
- patches_resolution[1] // (2 ** (self.num_layers-1-i_layer))),
- depth=depths[(self.num_layers-1-i_layer)],
- num_heads=num_heads[(self.num_layers-1-i_layer)],
- window_size=window_size,
- mlp_ratio=self.mlp_ratio,
- qkv_bias=qkv_bias, qk_scale=qk_scale,
- drop=drop_rate, attn_drop=attn_drop_rate,
- drop_path=dpr[sum(depths[:(self.num_layers-1-i_layer)]):sum(depths[:(self.num_layers-1-i_layer) + 1])],
- norm_layer=norm_layer,
- upsample=PatchExpand if (i_layer < self.num_layers - 1) else None,
- use_checkpoint=use_checkpoint)
- self.layers_up.append(layer_up)
- self.concat_back_dim.append(concat_linear)
-
- self.norm = norm_layer(self.num_features)
- self.norm_up= norm_layer(self.embed_dim)
-
- if self.final_upsample == "expand_first":
- print("---final upsample expand_first---")
- self.up = FinalPatchExpand_X4(input_resolution=(img_size//patch_size,img_size//patch_size),dim_scale=4,dim=embed_dim)
- self.output = nn.Conv2d(in_channels=embed_dim,out_channels=self.num_classes,kernel_size=1,bias=False)
-
- self.apply(self._init_weights)
-
- def _init_weights(self, m):
- if isinstance(m, nn.Linear):
- trunc_normal_(m.weight, std=.02)
- if isinstance(m, nn.Linear) and m.bias is not None:
- nn.init.constant_(m.bias, 0)
- elif isinstance(m, nn.LayerNorm):
- nn.init.constant_(m.bias, 0)
- nn.init.constant_(m.weight, 1.0)
-
- @torch.jit.ignore
- def no_weight_decay(self):
- return {'absolute_pos_embed'}
-
- @torch.jit.ignore
- def no_weight_decay_keywords(self):
- return {'relative_position_bias_table'}
-
- #Encoder and Bottleneck
- def forward_features(self, x):
- x = self.patch_embed(x)
- if self.ape:
- x = x + self.absolute_pos_embed
- x = self.pos_drop(x)
- x_downsample = []
-
- for layer in self.layers:
- x_downsample.append(x)
- x = layer(x)
-
- x = self.norm(x) # B L C
-
- return x, x_downsample
-
- #Dencoder and Skip connection
- def forward_up_features(self, x, x_downsample):
- for inx, layer_up in enumerate(self.layers_up):
- if inx == 0:
- x = layer_up(x)
- else:
- x = torch.cat([x,x_downsample[3-inx]],-1)
- x = self.concat_back_dim[inx](x)
- x = layer_up(x)
-
- x = self.norm_up(x) # B L C
-
- return x
-
- def up_x4(self, x):
- H, W = self.patches_resolution
- B, L, C = x.shape
- assert L == H*W, "input features has wrong size"
-
- if self.final_upsample=="expand_first":
- x = self.up(x)
- x = x.view(B,4*H,4*W,-1)
- x = x.permute(0,3,1,2) #B,C,H,W
- x = self.output(x)
-
- return x
-
- def forward(self, x):
- x, x_downsample = self.forward_features(x)
- x = self.forward_up_features(x,x_downsample)
- x = self.up_x4(x)
-
- return x
-
- def flops(self):
- flops = 0
- flops += self.patch_embed.flops()
- for i, layer in enumerate(self.layers):
- flops += layer.flops()
- flops += self.num_features * self.patches_resolution[0] * self.patches_resolution[1] // (2 ** self.num_layers)
- flops += self.num_features * self.num_classes
- return
\ No newline at end of file
diff --git a/pymic/net/transformer/transunet.py b/pymic/net/transformer/transunet.py
deleted file mode 100644
index 2b7ad30..0000000
--- a/pymic/net/transformer/transunet.py
+++ /dev/null
@@ -1,491 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-code adapted from: https://github.com/Beckschen/TransUNet
-"""
-from __future__ import print_function, division
-
-import copy
-# import logging
-import math
-import torch
-import torch.nn as nn
-from torch.nn import Dropout, Softmax, Linear, Conv2d, LayerNorm
-from torch.nn.modules.utils import _pair
-
-import numpy as np
-from scipy import ndimage
-from os.path import join as pjoin
-import pymic.net.transformer.transunet_cfg as configs
-from pymic.net.transformer.transunet_resnet import ResNetV2
-
-
-VIT_CONFIGS = {
- 'ViT-B_16': configs.get_b16_config(),
- 'ViT-B_32': configs.get_b32_config(),
- 'ViT-L_16': configs.get_l16_config(),
- 'ViT-L_32': configs.get_l32_config(),
- 'ViT-H_14': configs.get_h14_config(),
- 'R50-ViT-B_16': configs.get_r50_b16_config(),
- 'R50-ViT-L_16': configs.get_r50_l16_config(),
- 'testing': configs.get_testing(),
-}
-
-ATTENTION_Q = "MultiHeadDotProductAttention_1/query"
-ATTENTION_K = "MultiHeadDotProductAttention_1/key"
-ATTENTION_V = "MultiHeadDotProductAttention_1/value"
-ATTENTION_OUT = "MultiHeadDotProductAttention_1/out"
-FC_0 = "MlpBlock_3/Dense_0"
-FC_1 = "MlpBlock_3/Dense_1"
-ATTENTION_NORM = "LayerNorm_0"
-MLP_NORM = "LayerNorm_2"
-
-
-def np2th(weights, conv=False):
- """Possibly convert HWIO to OIHW."""
- if conv:
- weights = weights.transpose([3, 2, 0, 1])
- return torch.from_numpy(weights)
-
-
-def swish(x):
- return x * torch.sigmoid(x)
-
-
-ACT2FN = {"gelu": torch.nn.functional.gelu, "relu": torch.nn.functional.relu, "swish": swish}
-
-class Attention(nn.Module):
- def __init__(self, config, vis):
- super(Attention, self).__init__()
- self.vis = vis
- self.num_attention_heads = config.transformer["num_heads"]
- self.attention_head_size = int(config.hidden_size / self.num_attention_heads)
- self.all_head_size = self.num_attention_heads * self.attention_head_size
-
- self.query = Linear(config.hidden_size, self.all_head_size)
- self.key = Linear(config.hidden_size, self.all_head_size)
- self.value = Linear(config.hidden_size, self.all_head_size)
-
- self.out = Linear(config.hidden_size, config.hidden_size)
- self.attn_dropout = Dropout(config.transformer["attention_dropout_rate"])
- self.proj_dropout = Dropout(config.transformer["attention_dropout_rate"])
-
- self.softmax = Softmax(dim=-1)
-
- def transpose_for_scores(self, x):
- new_x_shape = x.size()[:-1] + (self.num_attention_heads, self.attention_head_size)
- x = x.view(*new_x_shape)
- return x.permute(0, 2, 1, 3)
-
- def forward(self, hidden_states):
- mixed_query_layer = self.query(hidden_states)
- mixed_key_layer = self.key(hidden_states)
- mixed_value_layer = self.value(hidden_states)
-
- query_layer = self.transpose_for_scores(mixed_query_layer)
- key_layer = self.transpose_for_scores(mixed_key_layer)
- value_layer = self.transpose_for_scores(mixed_value_layer)
-
- attention_scores = torch.matmul(query_layer, key_layer.transpose(-1, -2))
- attention_scores = attention_scores / math.sqrt(self.attention_head_size)
- attention_probs = self.softmax(attention_scores)
- weights = attention_probs if self.vis else None
- attention_probs = self.attn_dropout(attention_probs)
-
- context_layer = torch.matmul(attention_probs, value_layer)
- context_layer = context_layer.permute(0, 2, 1, 3).contiguous()
- new_context_layer_shape = context_layer.size()[:-2] + (self.all_head_size,)
- context_layer = context_layer.view(*new_context_layer_shape)
- attention_output = self.out(context_layer)
- attention_output = self.proj_dropout(attention_output)
- return attention_output, weights
-
-class Mlp(nn.Module):
- def __init__(self, config):
- super(Mlp, self).__init__()
- self.fc1 = Linear(config.hidden_size, config.transformer["mlp_dim"])
- self.fc2 = Linear(config.transformer["mlp_dim"], config.hidden_size)
- self.act_fn = ACT2FN["gelu"]
- self.dropout = Dropout(config.transformer["dropout_rate"])
-
- self._init_weights()
-
- def _init_weights(self):
- nn.init.xavier_uniform_(self.fc1.weight)
- nn.init.xavier_uniform_(self.fc2.weight)
- nn.init.normal_(self.fc1.bias, std=1e-6)
- nn.init.normal_(self.fc2.bias, std=1e-6)
-
- def forward(self, x):
- x = self.fc1(x)
- x = self.act_fn(x)
- x = self.dropout(x)
- x = self.fc2(x)
- x = self.dropout(x)
- return x
-
-class Embeddings(nn.Module):
- """Construct the embeddings from patch, position embeddings.
- """
- def __init__(self, config, img_size, in_channels=3):
- super(Embeddings, self).__init__()
- self.hybrid = None
- self.config = config
- img_size = _pair(img_size)
-
- if config.patches.get("grid") is not None: # ResNet
- grid_size = config.patches["grid"]
- patch_size = (img_size[0] // 16 // grid_size[0], img_size[1] // 16 // grid_size[1])
- patch_size_real = (patch_size[0] * 16, patch_size[1] * 16)
- n_patches = (img_size[0] // patch_size_real[0]) * (img_size[1] // patch_size_real[1])
- self.hybrid = True
- else:
- patch_size = _pair(config.patches["size"])
- n_patches = (img_size[0] // patch_size[0]) * (img_size[1] // patch_size[1])
- self.hybrid = False
-
- if self.hybrid:
- self.hybrid_model = ResNetV2(block_units=config.resnet.num_layers, width_factor=config.resnet.width_factor)
- in_channels = self.hybrid_model.width * 16
- self.patch_embeddings = Conv2d(in_channels=in_channels,
- out_channels=config.hidden_size,
- kernel_size=patch_size,
- stride=patch_size)
- self.position_embeddings = nn.Parameter(torch.zeros(1, n_patches, config.hidden_size))
-
- self.dropout = Dropout(config.transformer["dropout_rate"])
-
-
- def forward(self, x):
- if self.hybrid:
- x, features = self.hybrid_model(x)
- else:
- features = None
- x = self.patch_embeddings(x) # (B, hidden. n_patches^(1/2), n_patches^(1/2))
- x = x.flatten(2)
- x = x.transpose(-1, -2) # (B, n_patches, hidden)
-
- embeddings = x + self.position_embeddings
- embeddings = self.dropout(embeddings)
- return embeddings, features
-
-class Block(nn.Module):
- def __init__(self, config, vis):
- super(Block, self).__init__()
- self.hidden_size = config.hidden_size
- self.attention_norm = LayerNorm(config.hidden_size, eps=1e-6)
- self.ffn_norm = LayerNorm(config.hidden_size, eps=1e-6)
- self.ffn = Mlp(config)
- self.attn = Attention(config, vis)
-
- def forward(self, x):
- h = x
- x = self.attention_norm(x)
- x, weights = self.attn(x)
- x = x + h
-
- h = x
- x = self.ffn_norm(x)
- x = self.ffn(x)
- x = x + h
- return x, weights
-
- def load_from(self, weights, n_block):
- ROOT = f"Transformer/encoderblock_{n_block}"
- with torch.no_grad():
- query_weight = np2th(weights[pjoin(ROOT, ATTENTION_Q, "kernel")]).view(self.hidden_size, self.hidden_size).t()
- key_weight = np2th(weights[pjoin(ROOT, ATTENTION_K, "kernel")]).view(self.hidden_size, self.hidden_size).t()
- value_weight = np2th(weights[pjoin(ROOT, ATTENTION_V, "kernel")]).view(self.hidden_size, self.hidden_size).t()
- out_weight = np2th(weights[pjoin(ROOT, ATTENTION_OUT, "kernel")]).view(self.hidden_size, self.hidden_size).t()
-
- query_bias = np2th(weights[pjoin(ROOT, ATTENTION_Q, "bias")]).view(-1)
- key_bias = np2th(weights[pjoin(ROOT, ATTENTION_K, "bias")]).view(-1)
- value_bias = np2th(weights[pjoin(ROOT, ATTENTION_V, "bias")]).view(-1)
- out_bias = np2th(weights[pjoin(ROOT, ATTENTION_OUT, "bias")]).view(-1)
-
- self.attn.query.weight.copy_(query_weight)
- self.attn.key.weight.copy_(key_weight)
- self.attn.value.weight.copy_(value_weight)
- self.attn.out.weight.copy_(out_weight)
- self.attn.query.bias.copy_(query_bias)
- self.attn.key.bias.copy_(key_bias)
- self.attn.value.bias.copy_(value_bias)
- self.attn.out.bias.copy_(out_bias)
-
- mlp_weight_0 = np2th(weights[pjoin(ROOT, FC_0, "kernel")]).t()
- mlp_weight_1 = np2th(weights[pjoin(ROOT, FC_1, "kernel")]).t()
- mlp_bias_0 = np2th(weights[pjoin(ROOT, FC_0, "bias")]).t()
- mlp_bias_1 = np2th(weights[pjoin(ROOT, FC_1, "bias")]).t()
-
- self.ffn.fc1.weight.copy_(mlp_weight_0)
- self.ffn.fc2.weight.copy_(mlp_weight_1)
- self.ffn.fc1.bias.copy_(mlp_bias_0)
- self.ffn.fc2.bias.copy_(mlp_bias_1)
-
- self.attention_norm.weight.copy_(np2th(weights[pjoin(ROOT, ATTENTION_NORM, "scale")]))
- self.attention_norm.bias.copy_(np2th(weights[pjoin(ROOT, ATTENTION_NORM, "bias")]))
- self.ffn_norm.weight.copy_(np2th(weights[pjoin(ROOT, MLP_NORM, "scale")]))
- self.ffn_norm.bias.copy_(np2th(weights[pjoin(ROOT, MLP_NORM, "bias")]))
-
-class Encoder(nn.Module):
- def __init__(self, config, vis):
- super(Encoder, self).__init__()
- self.vis = vis
- self.layer = nn.ModuleList()
- self.encoder_norm = LayerNorm(config.hidden_size, eps=1e-6)
- for _ in range(config.transformer["num_layers"]):
- layer = Block(config, vis)
- self.layer.append(copy.deepcopy(layer))
-
- def forward(self, hidden_states):
- attn_weights = []
- for layer_block in self.layer:
- hidden_states, weights = layer_block(hidden_states)
- if self.vis:
- attn_weights.append(weights)
- encoded = self.encoder_norm(hidden_states)
- return encoded, attn_weights
-
-class Transformer(nn.Module):
- def __init__(self, config, img_size, vis):
- super(Transformer, self).__init__()
- self.embeddings = Embeddings(config, img_size=img_size)
- self.encoder = Encoder(config, vis)
-
- def forward(self, input_ids):
- embedding_output, features = self.embeddings(input_ids)
- encoded, attn_weights = self.encoder(embedding_output) # (B, n_patch, hidden)
- return encoded, attn_weights, features
-
-class Conv2dReLU(nn.Sequential):
- def __init__(
- self,
- in_channels,
- out_channels,
- kernel_size,
- padding=0,
- stride=1,
- use_batchnorm=True,
- ):
- conv = nn.Conv2d(
- in_channels,
- out_channels,
- kernel_size,
- stride=stride,
- padding=padding,
- bias=not (use_batchnorm),
- )
- relu = nn.ReLU(inplace=True)
-
- bn = nn.BatchNorm2d(out_channels)
-
- super(Conv2dReLU, self).__init__(conv, bn, relu)
-
-
-class DecoderBlock(nn.Module):
- def __init__(
- self,
- in_channels,
- out_channels,
- skip_channels=0,
- use_batchnorm=True,
- ):
- super().__init__()
- self.conv1 = Conv2dReLU(
- in_channels + skip_channels,
- out_channels,
- kernel_size=3,
- padding=1,
- use_batchnorm=use_batchnorm,
- )
- self.conv2 = Conv2dReLU(
- out_channels,
- out_channels,
- kernel_size=3,
- padding=1,
- use_batchnorm=use_batchnorm,
- )
- self.up = nn.UpsamplingBilinear2d(scale_factor=2)
-
- def forward(self, x, skip=None):
- x = self.up(x)
- if skip is not None:
- x = torch.cat([x, skip], dim=1)
- x = self.conv1(x)
- x = self.conv2(x)
- return x
-
-
-class SegmentationHead(nn.Sequential):
-
- def __init__(self, in_channels, out_channels, kernel_size=3, upsampling=1):
- conv2d = nn.Conv2d(in_channels, out_channels, kernel_size=kernel_size, padding=kernel_size // 2)
- upsampling = nn.UpsamplingBilinear2d(scale_factor=upsampling) if upsampling > 1 else nn.Identity()
- super().__init__(conv2d, upsampling)
-
-
-class DecoderCup(nn.Module):
- def __init__(self, config):
- super().__init__()
- self.config = config
- head_channels = 512
- self.conv_more = Conv2dReLU(
- config.hidden_size,
- head_channels,
- kernel_size=3,
- padding=1,
- use_batchnorm=True,
- )
- decoder_channels = config.decoder_channels
- in_channels = [head_channels] + list(decoder_channels[:-1])
- out_channels = decoder_channels
-
- if self.config.n_skip != 0:
- skip_channels = self.config.skip_channels
- for i in range(4-self.config.n_skip): # re-select the skip channels according to n_skip
- skip_channels[3-i]=0
-
- else:
- skip_channels=[0,0,0,0]
-
- blocks = [
- DecoderBlock(in_ch, out_ch, sk_ch) for in_ch, out_ch, sk_ch in zip(in_channels, out_channels, skip_channels)
- ]
- self.blocks = nn.ModuleList(blocks)
-
- def forward(self, hidden_states, features=None):
- B, n_patch, hidden = hidden_states.size() # reshape from (B, n_patch, hidden) to (B, h, w, hidden)
- h, w = int(np.sqrt(n_patch)), int(np.sqrt(n_patch))
- x = hidden_states.permute(0, 2, 1)
- x = x.contiguous().view(B, hidden, h, w)
- x = self.conv_more(x)
- for i, decoder_block in enumerate(self.blocks):
- if features is not None:
- skip = features[i] if (i < self.config.n_skip) else None
- else:
- skip = None
- x = decoder_block(x, skip=skip)
- return x
-
-class TransUNet(nn.Module):
- """
- Implementatin of TransUNet.
-
- * Reference: Jieneng Chen, Yongyi Lu et al:
- TransUNet: Transformers Make Strong Encoders for Medical Image Segmentation.
- `Arxiv 2021. `_
-
- Note that the input channel can only be 1 or 3, and the input image size should be 256x256.
- Parameters are given in the `params` dictionary, and should include the
- following fields:
-
- :param img_size: (tuple) The input image size, should be [256, 256].
- :param class_num: (int) The class number for segmentation task.
- :param vit_name: (string) The name for vit backbone. It can be one of the following: 'ViT-B_16',
- 'ViT-B_32','ViT-L_16', 'ViT-L_32', 'ViT-H_14'. 'R50-ViT-B_16', 'R50-ViT-L_16'.
- By default, it is 'R50-ViT-B_16'.
- """
- def __init__(self, params):
- super(TransUNet, self).__init__()
- vit_name = params.get("vit_name", 'R50-ViT-B_16')
- img_size = params['img_size']
- vis = params.get("vis", False)
- self.config = VIT_CONFIGS[vit_name]
- self.num_classes = params['class_num']
- self.zero_head = params.get("zero_head", False)
-
- self.classifier = self.config.classifier
- self.transformer = Transformer(self.config, img_size, vis)
- self.decoder = DecoderCup(self.config)
- self.segmentation_head = SegmentationHead(
- in_channels=self.config['decoder_channels'][-1],
- out_channels=self.num_classes,
- kernel_size=3,
- )
-
- def forward(self, x):
- x_shape = list(x.shape)
- if(len(x_shape) == 5):
- [N, C, D, H, W] = x_shape
- new_shape = [N*D, C, H, W]
- x = torch.transpose(x, 1, 2)
- x = torch.reshape(x, new_shape)
-
- if x.size()[1] == 1:
- x = x.repeat(1,3,1,1)
- elif(x.size()[1] !=3):
- raise ValueError("The input channel number should be 1 or 3 for TransUNet")
- x, attn_weights, features = self.transformer(x) # (B, n_patch, hidden)
- x = self.decoder(x, features)
- logits = self.segmentation_head(x)
-
- if(len(x_shape) == 5):
- new_shape = [N, D] + list(logits.shape)[1:]
- logits = torch.reshape(logits, new_shape)
- logits = torch.transpose(logits, 1, 2)
-
- return logits
-
- def load_from(self, weights):
- with torch.no_grad():
-
- res_weight = weights
- self.transformer.embeddings.patch_embeddings.weight.copy_(np2th(weights["embedding/kernel"], conv=True))
- self.transformer.embeddings.patch_embeddings.bias.copy_(np2th(weights["embedding/bias"]))
-
- self.transformer.encoder.encoder_norm.weight.copy_(np2th(weights["Transformer/encoder_norm/scale"]))
- self.transformer.encoder.encoder_norm.bias.copy_(np2th(weights["Transformer/encoder_norm/bias"]))
-
- posemb = np2th(weights["Transformer/posembed_input/pos_embedding"])
-
- posemb_new = self.transformer.embeddings.position_embeddings
- if posemb.size() == posemb_new.size():
- self.transformer.embeddings.position_embeddings.copy_(posemb)
- elif posemb.size()[1]-1 == posemb_new.size()[1]:
- posemb = posemb[:, 1:]
- self.transformer.embeddings.position_embeddings.copy_(posemb)
- else:
- # logger.info("load_pretrained: resized variant: %s to %s" % (posemb.size(), posemb_new.size()))
- ntok_new = posemb_new.size(1)
- if self.classifier == "seg":
- _, posemb_grid = posemb[:, :1], posemb[0, 1:]
- gs_old = int(np.sqrt(len(posemb_grid)))
- gs_new = int(np.sqrt(ntok_new))
- print('load_pretrained: grid-size from %s to %s' % (gs_old, gs_new))
- posemb_grid = posemb_grid.reshape(gs_old, gs_old, -1)
- zoom = (gs_new / gs_old, gs_new / gs_old, 1)
- posemb_grid = ndimage.zoom(posemb_grid, zoom, order=1) # th2np
- posemb_grid = posemb_grid.reshape(1, gs_new * gs_new, -1)
- posemb = posemb_grid
- self.transformer.embeddings.position_embeddings.copy_(np2th(posemb))
-
- # Encoder whole
- for bname, block in self.transformer.encoder.named_children():
- for uname, unit in block.named_children():
- unit.load_from(weights, n_block=uname)
-
- if self.transformer.embeddings.hybrid:
- self.transformer.embeddings.hybrid_model.root.conv.weight.copy_(np2th(res_weight["conv_root/kernel"], conv=True))
- gn_weight = np2th(res_weight["gn_root/scale"]).view(-1)
- gn_bias = np2th(res_weight["gn_root/bias"]).view(-1)
- self.transformer.embeddings.hybrid_model.root.gn.weight.copy_(gn_weight)
- self.transformer.embeddings.hybrid_model.root.gn.bias.copy_(gn_bias)
-
- for bname, block in self.transformer.embeddings.hybrid_model.body.named_children():
- for uname, unit in block.named_children():
- unit.load_from(res_weight, n_block=bname, n_unit=uname)
-
-if __name__ == "__main__":
- params = {'img_size': [256, 256],
- 'class_num': 2}
- net = TransUNet(params)
- net.double()
-
- for c in [1,3]:
- x = np.random.rand(4, c, 256, 256)
- xt = torch.from_numpy(x)
- xt = torch.tensor(xt)
-
- y = net(xt)
- print(len(y.size()))
- y = y.detach().numpy()
- print(y.shape)
\ No newline at end of file
diff --git a/pymic/net/transformer/transunet_cfg.py b/pymic/net/transformer/transunet_cfg.py
deleted file mode 100644
index aab62d4..0000000
--- a/pymic/net/transformer/transunet_cfg.py
+++ /dev/null
@@ -1,135 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-"""
-code adapted from: https://github.com/Beckschen/TransUNet
-"""
-import ml_collections
-
-def get_b16_config():
- """Returns the ViT-B/16 configuration."""
- config = ml_collections.ConfigDict()
- config.patches = ml_collections.ConfigDict({'size': (16, 16)})
- config.hidden_size = 768
- config.transformer = ml_collections.ConfigDict()
- config.transformer.mlp_dim = 3072
- config.transformer.num_heads = 12
- config.transformer.num_layers = 12
- config.transformer.attention_dropout_rate = 0.0
- config.transformer.dropout_rate = 0.1
-
- config.classifier = 'seg'
- config.representation_size = None
- config.resnet_pretrained_path = None
- config.pretrained_path = '../model/vit_checkpoint/imagenet21k/ViT-B_16.npz'
- config.patch_size = 16
-
- config.decoder_channels = (256, 128, 64, 16)
- config.n_classes = 2
- config.activation = 'softmax'
- return config
-
-
-def get_testing():
- """Returns a minimal configuration for testing."""
- config = ml_collections.ConfigDict()
- config.patches = ml_collections.ConfigDict({'size': (16, 16)})
- config.hidden_size = 1
- config.transformer = ml_collections.ConfigDict()
- config.transformer.mlp_dim = 1
- config.transformer.num_heads = 1
- config.transformer.num_layers = 1
- config.transformer.attention_dropout_rate = 0.0
- config.transformer.dropout_rate = 0.1
- config.classifier = 'token'
- config.representation_size = None
- return config
-
-def get_r50_b16_config():
- """Returns the Resnet50 + ViT-B/16 configuration."""
- config = get_b16_config()
- config.patches.grid = (16, 16)
- config.resnet = ml_collections.ConfigDict()
- config.resnet.num_layers = (3, 4, 9)
- config.resnet.width_factor = 1
-
- config.classifier = 'seg'
- config.pretrained_path = '../model/vit_checkpoint/imagenet21k/R50+ViT-B_16.npz'
- config.decoder_channels = (256, 128, 64, 16)
- config.skip_channels = [512, 256, 64, 16]
- config.n_classes = 2
- config.n_skip = 3
- config.activation = 'softmax'
-
- return config
-
-
-def get_b32_config():
- """Returns the ViT-B/32 configuration."""
- config = get_b16_config()
- config.patches.size = (32, 32)
- config.pretrained_path = '../model/vit_checkpoint/imagenet21k/ViT-B_32.npz'
- return config
-
-
-def get_l16_config():
- """Returns the ViT-L/16 configuration."""
- config = ml_collections.ConfigDict()
- config.patches = ml_collections.ConfigDict({'size': (16, 16)})
- config.hidden_size = 1024
- config.transformer = ml_collections.ConfigDict()
- config.transformer.mlp_dim = 4096
- config.transformer.num_heads = 16
- config.transformer.num_layers = 24
- config.transformer.attention_dropout_rate = 0.0
- config.transformer.dropout_rate = 0.1
- config.representation_size = None
-
- # custom
- config.classifier = 'seg'
- config.resnet_pretrained_path = None
- config.pretrained_path = '../model/vit_checkpoint/imagenet21k/ViT-L_16.npz'
- config.decoder_channels = (256, 128, 64, 16)
- config.n_classes = 2
- config.activation = 'softmax'
- return config
-
-
-def get_r50_l16_config():
- """Returns the Resnet50 + ViT-L/16 configuration. customized """
- config = get_l16_config()
- config.patches.grid = (16, 16)
- config.resnet = ml_collections.ConfigDict()
- config.resnet.num_layers = (3, 4, 9)
- config.resnet.width_factor = 1
-
- config.classifier = 'seg'
- config.resnet_pretrained_path = '../model/vit_checkpoint/imagenet21k/R50+ViT-B_16.npz'
- config.decoder_channels = (256, 128, 64, 16)
- config.skip_channels = [512, 256, 64, 16]
- config.n_classes = 2
- config.activation = 'softmax'
- return config
-
-
-def get_l32_config():
- """Returns the ViT-L/32 configuration."""
- config = get_l16_config()
- config.patches.size = (32, 32)
- return config
-
-
-def get_h14_config():
- """Returns the ViT-L/16 configuration."""
- config = ml_collections.ConfigDict()
- config.patches = ml_collections.ConfigDict({'size': (14, 14)})
- config.hidden_size = 1280
- config.transformer = ml_collections.ConfigDict()
- config.transformer.mlp_dim = 5120
- config.transformer.num_heads = 16
- config.transformer.num_layers = 32
- config.transformer.attention_dropout_rate = 0.0
- config.transformer.dropout_rate = 0.1
- config.classifier = 'token'
- config.representation_size = None
-
- return config
\ No newline at end of file
diff --git a/pymic/net/transformer/transunet_resnet.py b/pymic/net/transformer/transunet_resnet.py
deleted file mode 100644
index 144a268..0000000
--- a/pymic/net/transformer/transunet_resnet.py
+++ /dev/null
@@ -1,164 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-code adapted from: https://github.com/Beckschen/TransUNet
-"""
-from __future__ import print_function, division
-
-from os.path import join as pjoin
-from collections import OrderedDict
-
-import torch
-import torch.nn as nn
-import torch.nn.functional as F
-
-
-def np2th(weights, conv=False):
- """Possibly convert HWIO to OIHW."""
- if conv:
- weights = weights.transpose([3, 2, 0, 1])
- return torch.from_numpy(weights)
-
-
-class StdConv2d(nn.Conv2d):
-
- def forward(self, x):
- w = self.weight
- v, m = torch.var_mean(w, dim=[1, 2, 3], keepdim=True, unbiased=False)
- w = (w - m) / torch.sqrt(v + 1e-5)
- return F.conv2d(x, w, self.bias, self.stride, self.padding,
- self.dilation, self.groups)
-
-
-def conv3x3(cin, cout, stride=1, groups=1, bias=False):
- return StdConv2d(cin, cout, kernel_size=3, stride=stride,
- padding=1, bias=bias, groups=groups)
-
-
-def conv1x1(cin, cout, stride=1, bias=False):
- return StdConv2d(cin, cout, kernel_size=1, stride=stride,
- padding=0, bias=bias)
-
-
-class PreActBottleneck(nn.Module):
- """Pre-activation (v2) bottleneck block.
- """
-
- def __init__(self, cin, cout=None, cmid=None, stride=1):
- super().__init__()
- cout = cout or cin
- cmid = cmid or cout//4
-
- self.gn1 = nn.GroupNorm(32, cmid, eps=1e-6)
- self.conv1 = conv1x1(cin, cmid, bias=False)
- self.gn2 = nn.GroupNorm(32, cmid, eps=1e-6)
- self.conv2 = conv3x3(cmid, cmid, stride, bias=False) # Original code has it on conv1!!
- self.gn3 = nn.GroupNorm(32, cout, eps=1e-6)
- self.conv3 = conv1x1(cmid, cout, bias=False)
- self.relu = nn.ReLU(inplace=True)
-
- if (stride != 1 or cin != cout):
- # Projection also with pre-activation according to paper.
- self.downsample = conv1x1(cin, cout, stride, bias=False)
- self.gn_proj = nn.GroupNorm(cout, cout)
-
- def forward(self, x):
-
- # Residual branch
- residual = x
- if hasattr(self, 'downsample'):
- residual = self.downsample(x)
- residual = self.gn_proj(residual)
-
- # Unit's branch
- y = self.relu(self.gn1(self.conv1(x)))
- y = self.relu(self.gn2(self.conv2(y)))
- y = self.gn3(self.conv3(y))
-
- y = self.relu(residual + y)
- return y
-
- def load_from(self, weights, n_block, n_unit):
- conv1_weight = np2th(weights[pjoin(n_block, n_unit, "conv1/kernel")], conv=True)
- conv2_weight = np2th(weights[pjoin(n_block, n_unit, "conv2/kernel")], conv=True)
- conv3_weight = np2th(weights[pjoin(n_block, n_unit, "conv3/kernel")], conv=True)
-
- gn1_weight = np2th(weights[pjoin(n_block, n_unit, "gn1/scale")])
- gn1_bias = np2th(weights[pjoin(n_block, n_unit, "gn1/bias")])
-
- gn2_weight = np2th(weights[pjoin(n_block, n_unit, "gn2/scale")])
- gn2_bias = np2th(weights[pjoin(n_block, n_unit, "gn2/bias")])
-
- gn3_weight = np2th(weights[pjoin(n_block, n_unit, "gn3/scale")])
- gn3_bias = np2th(weights[pjoin(n_block, n_unit, "gn3/bias")])
-
- self.conv1.weight.copy_(conv1_weight)
- self.conv2.weight.copy_(conv2_weight)
- self.conv3.weight.copy_(conv3_weight)
-
- self.gn1.weight.copy_(gn1_weight.view(-1))
- self.gn1.bias.copy_(gn1_bias.view(-1))
-
- self.gn2.weight.copy_(gn2_weight.view(-1))
- self.gn2.bias.copy_(gn2_bias.view(-1))
-
- self.gn3.weight.copy_(gn3_weight.view(-1))
- self.gn3.bias.copy_(gn3_bias.view(-1))
-
- if hasattr(self, 'downsample'):
- proj_conv_weight = np2th(weights[pjoin(n_block, n_unit, "conv_proj/kernel")], conv=True)
- proj_gn_weight = np2th(weights[pjoin(n_block, n_unit, "gn_proj/scale")])
- proj_gn_bias = np2th(weights[pjoin(n_block, n_unit, "gn_proj/bias")])
-
- self.downsample.weight.copy_(proj_conv_weight)
- self.gn_proj.weight.copy_(proj_gn_weight.view(-1))
- self.gn_proj.bias.copy_(proj_gn_bias.view(-1))
-
-class ResNetV2(nn.Module):
- """Implementation of Pre-activation (v2) ResNet mode."""
-
- def __init__(self, block_units, width_factor):
- super().__init__()
- width = int(64 * width_factor)
- self.width = width
-
- self.root = nn.Sequential(OrderedDict([
- ('conv', StdConv2d(3, width, kernel_size=7, stride=2, bias=False, padding=3)),
- ('gn', nn.GroupNorm(32, width, eps=1e-6)),
- ('relu', nn.ReLU(inplace=True)),
- # ('pool', nn.MaxPool2d(kernel_size=3, stride=2, padding=0))
- ]))
-
- self.body = nn.Sequential(OrderedDict([
- ('block1', nn.Sequential(OrderedDict(
- [('unit1', PreActBottleneck(cin=width, cout=width*4, cmid=width))] +
- [(f'unit{i:d}', PreActBottleneck(cin=width*4, cout=width*4, cmid=width)) for i in range(2, block_units[0] + 1)],
- ))),
- ('block2', nn.Sequential(OrderedDict(
- [('unit1', PreActBottleneck(cin=width*4, cout=width*8, cmid=width*2, stride=2))] +
- [(f'unit{i:d}', PreActBottleneck(cin=width*8, cout=width*8, cmid=width*2)) for i in range(2, block_units[1] + 1)],
- ))),
- ('block3', nn.Sequential(OrderedDict(
- [('unit1', PreActBottleneck(cin=width*8, cout=width*16, cmid=width*4, stride=2))] +
- [(f'unit{i:d}', PreActBottleneck(cin=width*16, cout=width*16, cmid=width*4)) for i in range(2, block_units[2] + 1)],
- ))),
- ]))
-
- def forward(self, x):
- features = []
- b, c, in_size, _ = x.size()
- x = self.root(x)
- features.append(x)
- x = nn.MaxPool2d(kernel_size=3, stride=2, padding=0)(x)
- for i in range(len(self.body)-1):
- x = self.body[i](x)
- right_size = int(in_size / 4 / (i+1))
- if x.size()[2] != right_size:
- pad = right_size - x.size()[2]
- assert pad < 3 and pad > 0, "x {} should {}".format(x.size(), right_size)
- feat = torch.zeros((b, x.size()[1], right_size, right_size), device=x.device)
- feat[:, :, 0:x.size()[2], 0:x.size()[3]] = x[:]
- else:
- feat = x
- features.append(feat)
- x = self.body[-1](x)
- return x, features[::-1]
\ No newline at end of file
diff --git a/pymic/net/transformer/unetr.py b/pymic/net/transformer/unetr.py
deleted file mode 100644
index ea90b2f..0000000
--- a/pymic/net/transformer/unetr.py
+++ /dev/null
@@ -1,227 +0,0 @@
-from __future__ import print_function, division
-
-import torch
-import torch.nn as nn
-
-from monai.networks.blocks import UnetrBasicBlock, UnetrPrUpBlock, UnetrUpBlock
-from monai.networks.blocks.dynunet_block import UnetOutBlock
-from monai.networks.nets import ViT
-
-
-class UNETR(nn.Module):
- """
- UNETR based on: "Hatamizadeh et al.,
- UNETR: Transformers for 3D Medical Image Segmentation "
- """
-
- def __init__(self, params):
- # in_channels: int,
- # out_channels: int,
- # img_size: Tuple[int, int, int],
- # feature_size: int = 16,
- # hidden_size: int = 768,
- # mlp_dim: int = 3072,
- # num_heads: int = 12,
- # pos_embed: str = "perceptron",
- # norm_name: Union[Tuple, str] = "instance",
- # conv_block: bool = False,
- # res_block: bool = True,
- # dropout_rate: float = 0.0,
- # ) -> None:
- """
- Args:
- in_channels: dimension of input channels.
- out_channels: dimension of output channels.
- img_size: dimension of input image.
- feature_size: dimension of network feature size.
- hidden_size: dimension of hidden layer.
- mlp_dim: dimension of feedforward layer.
- num_heads: number of attention heads.
- pos_embed: position embedding layer type.
- norm_name: feature normalization type and arguments.
- conv_block: bool argument to determine if convolutional block is used.
- res_block: bool argument to determine if residual block is used.
- dropout_rate: faction of the input units to drop.
- Examples::
- # for single channel input 4-channel output with patch size of (96,96,96), feature size of 32 and batch norm
- >>> net = UNETR(in_channels=1, out_channels=4, img_size=(96,96,96), feature_size=32, norm_name='batch')
- # for 4-channel input 3-channel output with patch size of (128,128,128), conv position embedding and instance norm
- >>> net = UNETR(in_channels=4, out_channels=3, img_size=(128,128,128), pos_embed='conv', norm_name='instance')
- """
-
- super().__init__()
- in_channels = params['in_chns']
- out_channels = params['class_num']
- img_size = params['img_size']
- feature_size = 16
- hidden_size = 768
- mlp_dim = 3072
- num_heads = 12
- pos_embed = "perceptron"
- norm_name = "instance"
- conv_block = False
- res_block = True
- dropout_rate = 0.0
-
- if not (0 <= dropout_rate <= 1):
- raise AssertionError("dropout_rate should be between 0 and 1.")
-
- if hidden_size % num_heads != 0:
- raise AssertionError("hidden size should be divisible by num_heads.")
-
- if pos_embed not in ["conv", "perceptron"]:
- raise KeyError(f"Position embedding layer of type {pos_embed} is not supported.")
-
- self.num_layers = 12
- self.patch_size = (16, 16, 16)
- self.feat_size = (
- img_size[0] // self.patch_size[0],
- img_size[1] // self.patch_size[1],
- img_size[2] // self.patch_size[2],
- )
- self.hidden_size = hidden_size
- self.classification = False
- self.vit = ViT(
- in_channels=in_channels,
- img_size=img_size,
- patch_size=self.patch_size,
- hidden_size=hidden_size,
- mlp_dim=mlp_dim,
- num_layers=self.num_layers,
- num_heads=num_heads,
- pos_embed=pos_embed,
- classification=self.classification,
- dropout_rate=dropout_rate,
- )
- self.encoder1 = UnetrBasicBlock(
- spatial_dims=3,
- in_channels=in_channels,
- out_channels=feature_size,
- kernel_size=3,
- stride=1,
- norm_name=norm_name,
- res_block=res_block,
- )
- self.encoder2 = UnetrPrUpBlock(
- spatial_dims=3,
- in_channels=hidden_size,
- out_channels=feature_size * 2,
- num_layer=2,
- kernel_size=3,
- stride=1,
- upsample_kernel_size=2,
- norm_name=norm_name,
- conv_block=conv_block,
- res_block=res_block,
- )
- self.encoder3 = UnetrPrUpBlock(
- spatial_dims=3,
- in_channels=hidden_size,
- out_channels=feature_size * 4,
- num_layer=1,
- kernel_size=3,
- stride=1,
- upsample_kernel_size=2,
- norm_name=norm_name,
- conv_block=conv_block,
- res_block=res_block,
- )
- self.encoder4 = UnetrPrUpBlock(
- spatial_dims=3,
- in_channels=hidden_size,
- out_channels=feature_size * 8,
- num_layer=0,
- kernel_size=3,
- stride=1,
- upsample_kernel_size=2,
- norm_name=norm_name,
- conv_block=conv_block,
- res_block=res_block,
- )
- self.decoder5 = UnetrUpBlock(
- spatial_dims=3,
- in_channels=hidden_size,
- out_channels=feature_size * 8,
- kernel_size=3,
- upsample_kernel_size=2,
- norm_name=norm_name,
- res_block=res_block,
- )
- self.decoder4 = UnetrUpBlock(
- spatial_dims=3,
- in_channels=feature_size * 8,
- out_channels=feature_size * 4,
- kernel_size=3,
- upsample_kernel_size=2,
- norm_name=norm_name,
- res_block=res_block,
- )
- self.decoder3 = UnetrUpBlock(
- spatial_dims=3,
- in_channels=feature_size * 4,
- out_channels=feature_size * 2,
- kernel_size=3,
- upsample_kernel_size=2,
- norm_name=norm_name,
- res_block=res_block,
- )
- self.decoder2 = UnetrUpBlock(
- spatial_dims=3,
- in_channels=feature_size * 2,
- out_channels=feature_size,
- kernel_size=3,
- upsample_kernel_size=2,
- norm_name=norm_name,
- res_block=res_block,
- )
- self.out = UnetOutBlock(spatial_dims=3, in_channels=feature_size, out_channels=out_channels) # type: ignore
-
- def proj_feat(self, x, hidden_size, feat_size):
- x = x.view(x.size(0), feat_size[0], feat_size[1], feat_size[2], hidden_size)
- x = x.permute(0, 4, 1, 2, 3).contiguous()
- return x
-
- def load_from(self, weights):
- with torch.no_grad():
- res_weight = weights
- # copy weights from patch embedding
- for i in weights["state_dict"]:
- print(i)
- self.vit.patch_embedding.position_embeddings.copy_(
- weights["state_dict"]["module.transformer.patch_embedding.position_embeddings_3d"]
- )
- self.vit.patch_embedding.cls_token.copy_(
- weights["state_dict"]["module.transformer.patch_embedding.cls_token"]
- )
- self.vit.patch_embedding.patch_embeddings[1].weight.copy_(
- weights["state_dict"]["module.transformer.patch_embedding.patch_embeddings.1.weight"]
- )
- self.vit.patch_embedding.patch_embeddings[1].bias.copy_(
- weights["state_dict"]["module.transformer.patch_embedding.patch_embeddings.1.bias"]
- )
-
- # copy weights from encoding blocks (default: num of blocks: 12)
- for bname, block in self.vit.blocks.named_children():
- print(block)
- block.loadFrom(weights, n_block=bname)
- # last norm layer of transformer
- self.vit.norm.weight.copy_(weights["state_dict"]["module.transformer.norm.weight"])
- self.vit.norm.bias.copy_(weights["state_dict"]["module.transformer.norm.bias"])
-
- def forward(self, x_in):
- x, hidden_states_out = self.vit(x_in)
- enc1 = self.encoder1(x_in)
- x2 = hidden_states_out[3]
- enc2 = self.encoder2(self.proj_feat(x2, self.hidden_size, self.feat_size))
- x3 = hidden_states_out[6]
- enc3 = self.encoder3(self.proj_feat(x3, self.hidden_size, self.feat_size))
- x4 = hidden_states_out[9]
- enc4 = self.encoder4(self.proj_feat(x4, self.hidden_size, self.feat_size))
- dec4 = self.proj_feat(x, self.hidden_size, self.feat_size)
- dec3 = self.decoder5(dec4, enc4)
- dec2 = self.decoder4(dec3, enc3)
- dec1 = self.decoder3(dec2, enc2)
- out = self.decoder2(dec1, enc1)
- logits = self.out(out)
- return logits
-
diff --git a/pymic/net/transformer/unetr_pp.py b/pymic/net/transformer/unetr_pp.py
deleted file mode 100644
index 4313744..0000000
--- a/pymic/net/transformer/unetr_pp.py
+++ /dev/null
@@ -1,475 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-
-import numpy as np
-import torch
-import torch.nn as nn
-import torch.nn.functional as F
-from typing import Optional, Sequence, Tuple, Union
-from pymic.net.transformer.unetr_pp_block import UnetOutBlock, UnetResBlock, get_conv_layer
-from timm.models.layers import trunc_normal_
-from monai.utils import optional_import
-from monai.networks.blocks.convolutions import Convolution
-from monai.networks.layers.factories import Act, Norm
-from monai.networks.layers.utils import get_act_layer, get_norm_layer
-
-einops, _ = optional_import("einops")
-
-class LayerNorm(nn.Module):
- def __init__(self, normalized_shape, eps=1e-6, data_format="channels_last"):
- super().__init__()
- self.weight = nn.Parameter(torch.ones(normalized_shape))
- self.bias = nn.Parameter(torch.zeros(normalized_shape))
- self.eps = eps
- self.data_format = data_format
- if self.data_format not in ["channels_last", "channels_first"]:
- raise NotImplementedError
- self.normalized_shape = (normalized_shape,)
-
- def forward(self, x):
- if self.data_format == "channels_last":
- return F.layer_norm(x, self.normalized_shape, self.weight, self.bias, self.eps)
- elif self.data_format == "channels_first":
- u = x.mean(1, keepdim=True)
- s = (x - u).pow(2).mean(1, keepdim=True)
- x = (x - u) / torch.sqrt(s + self.eps)
- x = self.weight[:, None, None] * x + self.bias[:, None, None]
- return x
-
-class EPA(nn.Module):
- """
- Efficient Paired Attention Block, based on: "Shaker et al.,
- UNETR++: Delving into Efficient and Accurate 3D Medical Image Segmentation"
- """
- def __init__(self, input_size, hidden_size, proj_size, num_heads=4, qkv_bias=False,
- channel_attn_drop=0.1, spatial_attn_drop=0.1):
- super().__init__()
- self.num_heads = num_heads
- self.temperature = nn.Parameter(torch.ones(num_heads, 1, 1))
- self.temperature2 = nn.Parameter(torch.ones(num_heads, 1, 1))
-
- # qkvv are 4 linear layers (query_shared, key_shared, value_spatial, value_channel)
- self.qkvv = nn.Linear(hidden_size, hidden_size * 4, bias=qkv_bias)
-
- # E and F are projection matrices with shared weights used in spatial attention module to project
- # keys and values from HWD-dimension to P-dimension
- self.E = self.F = nn.Linear(input_size, proj_size)
-
- self.attn_drop = nn.Dropout(channel_attn_drop)
- self.attn_drop_2 = nn.Dropout(spatial_attn_drop)
-
- self.out_proj = nn.Linear(hidden_size, int(hidden_size // 2))
- self.out_proj2 = nn.Linear(hidden_size, int(hidden_size // 2))
-
- def forward(self, x):
- B, N, C = x.shape
-
- qkvv = self.qkvv(x).reshape(B, N, 4, self.num_heads, C // self.num_heads)
-
- qkvv = qkvv.permute(2, 0, 3, 1, 4)
-
- q_shared, k_shared, v_CA, v_SA = qkvv[0], qkvv[1], qkvv[2], qkvv[3]
-
- q_shared = q_shared.transpose(-2, -1)
- k_shared = k_shared.transpose(-2, -1)
- v_CA = v_CA.transpose(-2, -1)
- v_SA = v_SA.transpose(-2, -1)
-
- k_shared_projected = self.E(k_shared)
-
- v_SA_projected = self.F(v_SA)
-
- q_shared = torch.nn.functional.normalize(q_shared, dim=-1)
- k_shared = torch.nn.functional.normalize(k_shared, dim=-1)
-
- attn_CA = (q_shared @ k_shared.transpose(-2, -1)) * self.temperature
-
- attn_CA = attn_CA.softmax(dim=-1)
- attn_CA = self.attn_drop(attn_CA)
-
- x_CA = (attn_CA @ v_CA).permute(0, 3, 1, 2).reshape(B, N, C)
-
- attn_SA = (q_shared.permute(0, 1, 3, 2) @ k_shared_projected) * self.temperature2
-
- attn_SA = attn_SA.softmax(dim=-1)
- attn_SA = self.attn_drop_2(attn_SA)
-
- x_SA = (attn_SA @ v_SA_projected.transpose(-2, -1)).permute(0, 3, 1, 2).reshape(B, N, C)
-
- # Concat fusion
- x_SA = self.out_proj(x_SA)
- x_CA = self.out_proj2(x_CA)
- x = torch.cat((x_SA, x_CA), dim=-1)
- return x
-
- @torch.jit.ignore
- def no_weight_decay(self):
- return {'temperature', 'temperature2'}
-
-
-class TransformerBlock(nn.Module):
- """
- A transformer block, based on: "Shaker et al.,
- UNETR++: Delving into Efficient and Accurate 3D Medical Image Segmentation"
- """
-
- def __init__(
- self,
- input_size: int,
- hidden_size: int,
- proj_size: int,
- num_heads: int,
- dropout_rate: float = 0.0,
- pos_embed=False,
- ) -> None:
- """
- Args:
- input_size: the size of the input for each stage.
- hidden_size: dimension of hidden layer.
- proj_size: projection size for keys and values in the spatial attention module.
- num_heads: number of attention heads.
- dropout_rate: faction of the input units to drop.
- pos_embed: bool argument to determine if positional embedding is used.
-
- """
-
- super().__init__()
-
- if not (0 <= dropout_rate <= 1):
- raise ValueError("dropout_rate should be between 0 and 1.")
-
- if hidden_size % num_heads != 0:
- print("Hidden size is ", hidden_size)
- print("Num heads is ", num_heads)
- raise ValueError("hidden_size should be divisible by num_heads.")
-
- self.norm = nn.LayerNorm(hidden_size)
- self.gamma = nn.Parameter(1e-6 * torch.ones(hidden_size), requires_grad=True)
- self.epa_block = EPA(input_size=input_size, hidden_size=hidden_size, proj_size=proj_size, num_heads=num_heads, channel_attn_drop=dropout_rate,spatial_attn_drop=dropout_rate)
- self.conv51 = UnetResBlock(3, hidden_size, hidden_size, kernel_size=3, stride=1, norm_name="batch")
- self.conv8 = nn.Sequential(nn.Dropout3d(0.1, False), nn.Conv3d(hidden_size, hidden_size, 1))
-
- self.pos_embed = None
- if pos_embed:
- self.pos_embed = nn.Parameter(torch.zeros(1, input_size, hidden_size))
-
- def forward(self, x):
- B, C, H, W, D = x.shape
- x = x.reshape(B, C, H * W * D).permute(0, 2, 1)
-
- if self.pos_embed is not None:
- x = x + self.pos_embed
- attn = x + self.gamma * self.epa_block(self.norm(x))
-
- attn_skip = attn.reshape(B, H, W, D, C).permute(0, 4, 1, 2, 3) # (B, C, H, W, D)
- attn = self.conv51(attn_skip)
- x = attn_skip + self.conv8(attn)
-
- return x
-
-class UnetrPPEncoder(nn.Module):
- def __init__(self, input_size=[32 * 32 * 32, 16 * 16 * 16, 8 * 8 * 8, 4 * 4 * 4],dims=[32, 64, 128, 256],
- proj_size =[64,64,64,32], depths=[3, 3, 3, 3], num_heads=4, spatial_dims=3,
- in_channels=1, dropout=0.0, transformer_dropout_rate=0.15, kernel_size=(2,4,4), **kwargs):
- super().__init__()
-
- self.downsample_layers = nn.ModuleList() # stem and 3 intermediate downsampling conv layers
- stem_layer = nn.Sequential(
- get_conv_layer(spatial_dims, in_channels, dims[0], kernel_size=kernel_size, stride=kernel_size,
- dropout=dropout, conv_only=True, ),
- get_norm_layer(name=("group", {"num_groups": in_channels}), channels=dims[0]),
- )
- self.downsample_layers.append(stem_layer)
- for i in range(3):
- downsample_layer = nn.Sequential(
- get_conv_layer(spatial_dims, dims[i], dims[i + 1], kernel_size=(2, 2, 2), stride=(2, 2, 2),
- dropout=dropout, conv_only=True, ),
- get_norm_layer(name=("group", {"num_groups": dims[i]}), channels=dims[i + 1]),
- )
- self.downsample_layers.append(downsample_layer)
-
- self.stages = nn.ModuleList() # 4 feature resolution stages, each consisting of multiple Transformer blocks
- for i in range(4):
- stage_blocks = []
- for j in range(depths[i]):
- stage_blocks.append(TransformerBlock(input_size=input_size[i], hidden_size=dims[i], proj_size=proj_size[i], num_heads=num_heads,
- dropout_rate=transformer_dropout_rate, pos_embed=True))
- self.stages.append(nn.Sequential(*stage_blocks))
- self.hidden_states = []
- self.apply(self._init_weights)
-
- def _init_weights(self, m):
- if isinstance(m, (nn.Conv2d, nn.Linear)):
- trunc_normal_(m.weight, std=.02)
- if m.bias is not None:
- nn.init.constant_(m.bias, 0)
- elif isinstance(m, (LayerNorm, nn.LayerNorm)):
- nn.init.constant_(m.bias, 0)
- nn.init.constant_(m.weight, 1.0)
-
- def forward_features(self, x):
- hidden_states = []
- x = self.downsample_layers[0](x)
- x = self.stages[0](x)
-
- hidden_states.append(x)
-
- for i in range(1, 4):
- x = self.downsample_layers[i](x)
- x = self.stages[i](x)
- if i == 3: # Reshape the output of the last stage
- x = einops.rearrange(x, "b c h w d -> b (h w d) c")
- hidden_states.append(x)
- return x, hidden_states
-
- def forward(self, x):
- x, hidden_states = self.forward_features(x)
- return x, hidden_states
-
-
-class UnetrUpBlock(nn.Module):
- def __init__(
- self,
- spatial_dims: int,
- in_channels: int,
- out_channels: int,
- kernel_size: Union[Sequence[int], int],
- upsample_kernel_size: Union[Sequence[int], int],
- norm_name: Union[Tuple, str],
- proj_size: int = 64,
- num_heads: int = 4,
- out_size: int = 0,
- depth: int = 3,
- conv_decoder: bool = False,
- ) -> None:
- """
- Args:
- spatial_dims: number of spatial dimensions.
- in_channels: number of input channels.
- out_channels: number of output channels.
- kernel_size: convolution kernel size.
- upsample_kernel_size: convolution kernel size for transposed convolution layers.
- norm_name: feature normalization type and arguments.
- proj_size: projection size for keys and values in the spatial attention module.
- num_heads: number of heads inside each EPA module.
- out_size: spatial size for each decoder.
- depth: number of blocks for the current decoder stage.
- """
-
- super().__init__()
- upsample_stride = upsample_kernel_size
- self.transp_conv = get_conv_layer(
- spatial_dims,
- in_channels,
- out_channels,
- kernel_size=upsample_kernel_size,
- stride=upsample_stride,
- conv_only=True,
- is_transposed=True,
- )
-
- # 4 feature resolution stages, each consisting of multiple residual blocks
- self.decoder_block = nn.ModuleList()
-
- # If this is the last decoder, use ConvBlock(UnetResBlock) instead of EPA_Block (see suppl. material in the paper)
- if conv_decoder == True:
- self.decoder_block.append(
- UnetResBlock(spatial_dims, out_channels, out_channels, kernel_size=kernel_size, stride=1,
- norm_name=norm_name, ))
- else:
- stage_blocks = []
- for j in range(depth):
- stage_blocks.append(TransformerBlock(input_size=out_size, hidden_size= out_channels, proj_size=proj_size, num_heads=num_heads,
- dropout_rate=0.15, pos_embed=True))
- self.decoder_block.append(nn.Sequential(*stage_blocks))
-
- def _init_weights(self, m):
- if isinstance(m, (nn.Conv2d, nn.Linear)):
- trunc_normal_(m.weight, std=.02)
- if m.bias is not None:
- nn.init.constant_(m.bias, 0)
- elif isinstance(m, (nn.LayerNorm)):
- nn.init.constant_(m.bias, 0)
- nn.init.constant_(m.weight, 1.0)
-
- def forward(self, inp, skip):
-
- out = self.transp_conv(inp)
- out = out + skip
- out = self.decoder_block[0](out)
-
- return out
-
-
-class UNETR_PP(nn.Module):
- """
- UNETR++ based on: "Shaker et al.,
- UNETR++: Delving into Efficient and Accurate 3D Medical Image Segmentation"
- """
-
- def __init__(self, params):
- """
- Args:
- in_channels: dimension of input channels.
- out_channels: dimension of output channels.
- img_size: dimension of input image.
- feature_size: dimension of network feature size.
- hidden_size: dimension of the last encoder.
- num_heads: number of attention heads.
- pos_embed: position embedding layer type.
- norm_name: feature normalization type and arguments.
- dropout_rate: faction of the input units to drop.
- depths: number of blocks for each stage.
- dims: number of channel maps for the stages.
- conv_op: type of convolution operation.
- do_ds: use deep supervision to compute the loss.
-
- """
- super().__init__()
- in_channels = params['in_chns']
- out_channels = params['class_num']
- img_size = params['img_size']
- self.res_mode= params.get("resolution_mode", 1)
- feature_size = params.get('feature_size', 16)
- hidden_size = params.get('hidden_size', 256)
- num_heads = params.get('num_heads', 4)
- pos_embed = params.get('pos_embed', "perceptron")
- norm_name = params.get('norm_name', "instance")
- dropout_rate = params.get('dropout_rate', 0.0)
- depths = params.get('depths', [3, 3, 3, 3])
- dims = params.get('dims', [32, 64, 128, 256])
- conv_op = nn.Conv3d
- do_ds = params.get('deep_supervise', True)
-
- self.load_mode = params.get('weights_load_mode', 'all')
- self.do_ds = do_ds
- self.conv_op = conv_op
- self.num_classes = out_channels
- if not (0 <= dropout_rate <= 1):
- raise AssertionError("dropout_rate should be between 0 and 1.")
-
- if pos_embed not in ["conv", "perceptron"]:
- raise KeyError(f"Position embedding layer of type {pos_embed} is not supported.")
-
- kernel_ds = [4, 2, 1]
- kernel_d = kernel_ds[self.res_mode]
- self.patch_size = (kernel_d, 4, 4)
-
- self.feat_size = (
- img_size[0] // self.patch_size[0] // 8, # 8 is the downsampling happened through the four encoders stages
- img_size[1] // self.patch_size[1] // 8, # 8 is the downsampling happened through the four encoders stages
- img_size[2] // self.patch_size[2] // 8, # 8 is the downsampling happened through the four encoders stages
- )
-
- self.hidden_size = hidden_size
-
- self.unetr_pp_encoder = UnetrPPEncoder(dims=dims, depths=depths, num_heads=num_heads,
- in_channels=in_channels, kernel_size=self.patch_size)
-
- self.encoder1 = UnetResBlock(
- spatial_dims=3,
- in_channels=in_channels,
- out_channels=feature_size,
- kernel_size=3,
- stride=1,
- norm_name=norm_name,
- )
- self.decoder5 = UnetrUpBlock(
- spatial_dims=3,
- in_channels=feature_size * 16,
- out_channels=feature_size * 8,
- kernel_size=3,
- upsample_kernel_size=2,
- norm_name=norm_name,
- out_size=8 * 8 * 8,
- )
- self.decoder4 = UnetrUpBlock(
- spatial_dims=3,
- in_channels=feature_size * 8,
- out_channels=feature_size * 4,
- kernel_size=3,
- upsample_kernel_size=2,
- norm_name=norm_name,
- out_size=16 * 16 * 16,
- )
- self.decoder3 = UnetrUpBlock(
- spatial_dims=3,
- in_channels=feature_size * 4,
- out_channels=feature_size * 2,
- kernel_size=3,
- upsample_kernel_size=2,
- norm_name=norm_name,
- out_size=32 * 32 * 32,
- )
-
- self.decoder2 = UnetrUpBlock(
- spatial_dims=3,
- in_channels=feature_size * 2,
- out_channels=feature_size,
- kernel_size=3,
- upsample_kernel_size= self.patch_size,
- norm_name=norm_name,
- out_size= kernel_d*32 * 128 * 128,
- conv_decoder=True,
- )
- self.out1 = UnetOutBlock(spatial_dims=3, in_channels=feature_size, out_channels=out_channels)
- # if self.do_ds:
- self.out2 = UnetOutBlock(spatial_dims=3, in_channels=feature_size * 2, out_channels=out_channels)
- self.out3 = UnetOutBlock(spatial_dims=3, in_channels=feature_size * 4, out_channels=out_channels)
-
- def proj_feat(self, x, hidden_size, feat_size):
- x = x.view(x.size(0), feat_size[0], feat_size[1], feat_size[2], hidden_size)
- x = x.permute(0, 4, 1, 2, 3).contiguous()
- return x
-
- def forward(self, x_in):
- x_output, hidden_states = self.unetr_pp_encoder(x_in)
-
- convBlock = self.encoder1(x_in)
-
- # Four encoders
- enc1 = hidden_states[0]
- enc2 = hidden_states[1]
- enc3 = hidden_states[2]
- enc4 = hidden_states[3]
-
- # Four decoders
- dec4 = self.proj_feat(enc4, self.hidden_size, self.feat_size)
- dec3 = self.decoder5(dec4, enc3)
- dec2 = self.decoder4(dec3, enc2)
- dec1 = self.decoder3(dec2, enc1)
-
- out = self.decoder2(dec1, convBlock)
- if self.do_ds:
- logits = [self.out1(out), self.out2(dec1), self.out3(dec2)]
- else:
- logits = self.out1(out)
-
- return logits
-
- def get_parameters_to_load(self):
- state_dict = self.state_dict()
- if(self.load_mode == 'encoder'):
- state_dict = {k:v for k, v in state_dict.items() if "unetr_pp_encoder" in k}
- return state_dict
-
-if __name__ == "__main__":
- depths = [128, 64, 32]
- for i in range(3):
- params = {'in_chns': 4,
- 'class_num': 2,
- 'img_size': [depths[i], 128, 128],
- 'resolution_mode': i
- }
- net = UNETR_PP(params)
- net.double()
-
- x = np.random.rand(2, 4, depths[i], 128, 128)
- xt = torch.from_numpy(x)
- xt = torch.tensor(xt)
-
- y = net(xt)
- print(len(y))
- for yi in y:
- yi = yi.detach().numpy()
- print(yi.shape)
\ No newline at end of file
diff --git a/pymic/net/transformer/unetr_pp_block.py b/pymic/net/transformer/unetr_pp_block.py
deleted file mode 100644
index 89a8769..0000000
--- a/pymic/net/transformer/unetr_pp_block.py
+++ /dev/null
@@ -1,278 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-
-import numpy as np
-import torch
-import torch.nn as nn
-from typing import Optional, Sequence, Tuple, Union
-from monai.networks.blocks.convolutions import Convolution
-from monai.networks.layers.factories import Act, Norm
-from monai.networks.layers.utils import get_act_layer, get_norm_layer
-
-
-class UnetResBlock(nn.Module):
- """
- A skip-connection based module that can be used for DynUNet, based on:
- `Automated Design of Deep Learning Methods for Biomedical Image Segmentation `_.
- `nnU-Net: Self-adapting Framework for U-Net-Based Medical Image Segmentation `_.
-
- Args:
- spatial_dims: number of spatial dimensions.
- in_channels: number of input channels.
- out_channels: number of output channels.
- kernel_size: convolution kernel size.
- stride: convolution stride.
- norm_name: feature normalization type and arguments.
- act_name: activation layer type and arguments.
- dropout: dropout probability.
-
- """
-
- def __init__(
- self,
- spatial_dims: int,
- in_channels: int,
- out_channels: int,
- kernel_size: Union[Sequence[int], int],
- stride: Union[Sequence[int], int],
- norm_name: Union[Tuple, str],
- act_name: Union[Tuple, str] = ("leakyrelu", {"inplace": True, "negative_slope": 0.01}),
- dropout: Optional[Union[Tuple, str, float]] = None,
- ):
- super().__init__()
- self.conv1 = get_conv_layer(
- spatial_dims,
- in_channels,
- out_channels,
- kernel_size=kernel_size,
- stride=stride,
- dropout=dropout,
- conv_only=True,
- )
- self.conv2 = get_conv_layer(
- spatial_dims, out_channels, out_channels, kernel_size=kernel_size, stride=1, dropout=dropout, conv_only=True
- )
- self.lrelu = get_act_layer(name=act_name)
- self.norm1 = get_norm_layer(name=norm_name, spatial_dims=spatial_dims, channels=out_channels)
- self.norm2 = get_norm_layer(name=norm_name, spatial_dims=spatial_dims, channels=out_channels)
- self.downsample = in_channels != out_channels
- stride_np = np.atleast_1d(stride)
- if not np.all(stride_np == 1):
- self.downsample = True
- if self.downsample:
- self.conv3 = get_conv_layer(
- spatial_dims, in_channels, out_channels, kernel_size=1, stride=stride, dropout=dropout, conv_only=True
- )
- self.norm3 = get_norm_layer(name=norm_name, spatial_dims=spatial_dims, channels=out_channels)
-
- def forward(self, inp):
- residual = inp
- out = self.conv1(inp)
- out = self.norm1(out)
- out = self.lrelu(out)
- out = self.conv2(out)
- out = self.norm2(out)
- if hasattr(self, "conv3"):
- residual = self.conv3(residual)
- if hasattr(self, "norm3"):
- residual = self.norm3(residual)
- out += residual
- out = self.lrelu(out)
- return out
-
-
-class UnetBasicBlock(nn.Module):
- """
- A CNN module module that can be used for DynUNet, based on:
- `Automated Design of Deep Learning Methods for Biomedical Image Segmentation `_.
- `nnU-Net: Self-adapting Framework for U-Net-Based Medical Image Segmentation `_.
-
- Args:
- spatial_dims: number of spatial dimensions.
- in_channels: number of input channels.
- out_channels: number of output channels.
- kernel_size: convolution kernel size.
- stride: convolution stride.
- norm_name: feature normalization type and arguments.
- act_name: activation layer type and arguments.
- dropout: dropout probability.
-
- """
-
- def __init__(
- self,
- spatial_dims: int,
- in_channels: int,
- out_channels: int,
- kernel_size: Union[Sequence[int], int],
- stride: Union[Sequence[int], int],
- norm_name: Union[Tuple, str],
- act_name: Union[Tuple, str] = ("leakyrelu", {"inplace": True, "negative_slope": 0.01}),
- dropout: Optional[Union[Tuple, str, float]] = None,
- ):
- super().__init__()
- self.conv1 = get_conv_layer(
- spatial_dims,
- in_channels,
- out_channels,
- kernel_size=kernel_size,
- stride=stride,
- dropout=dropout,
- conv_only=True,
- )
- self.conv2 = get_conv_layer(
- spatial_dims, out_channels, out_channels, kernel_size=kernel_size, stride=1, dropout=dropout, conv_only=True
- )
- self.lrelu = get_act_layer(name=act_name)
- self.norm1 = get_norm_layer(name=norm_name, spatial_dims=spatial_dims, channels=out_channels)
- self.norm2 = get_norm_layer(name=norm_name, spatial_dims=spatial_dims, channels=out_channels)
-
- def forward(self, inp):
- out = self.conv1(inp)
- out = self.norm1(out)
- out = self.lrelu(out)
- out = self.conv2(out)
- out = self.norm2(out)
- out = self.lrelu(out)
- return out
-
-
-class UnetUpBlock(nn.Module):
- """
- An upsampling module that can be used for DynUNet, based on:
- `Automated Design of Deep Learning Methods for Biomedical Image Segmentation `_.
- `nnU-Net: Self-adapting Framework for U-Net-Based Medical Image Segmentation `_.
-
- Args:
- spatial_dims: number of spatial dimensions.
- in_channels: number of input channels.
- out_channels: number of output channels.
- kernel_size: convolution kernel size.
- stride: convolution stride.
- upsample_kernel_size: convolution kernel size for transposed convolution layers.
- norm_name: feature normalization type and arguments.
- act_name: activation layer type and arguments.
- dropout: dropout probability.
- trans_bias: transposed convolution bias.
-
- """
-
- def __init__(
- self,
- spatial_dims: int,
- in_channels: int,
- out_channels: int,
- kernel_size: Union[Sequence[int], int],
- stride: Union[Sequence[int], int],
- upsample_kernel_size: Union[Sequence[int], int],
- norm_name: Union[Tuple, str],
- act_name: Union[Tuple, str] = ("leakyrelu", {"inplace": True, "negative_slope": 0.01}),
- dropout: Optional[Union[Tuple, str, float]] = None,
- trans_bias: bool = False,
- ):
- super().__init__()
- upsample_stride = upsample_kernel_size
- self.transp_conv = get_conv_layer(
- spatial_dims,
- in_channels,
- out_channels,
- kernel_size=upsample_kernel_size,
- stride=upsample_stride,
- dropout=dropout,
- bias=trans_bias,
- conv_only=True,
- is_transposed=True,
- )
- self.conv_block = UnetBasicBlock(
- spatial_dims,
- out_channels + out_channels,
- out_channels,
- kernel_size=kernel_size,
- stride=1,
- dropout=dropout,
- norm_name=norm_name,
- act_name=act_name,
- )
-
- def forward(self, inp, skip):
- # number of channels for skip should equals to out_channels
- out = self.transp_conv(inp)
- out = torch.cat((out, skip), dim=1)
- out = self.conv_block(out)
- return out
-
-
-class UnetOutBlock(nn.Module):
- def __init__(
- self, spatial_dims: int, in_channels: int, out_channels: int, dropout: Optional[Union[Tuple, str, float]] = None
- ):
- super().__init__()
- self.conv = get_conv_layer(
- spatial_dims, in_channels, out_channels, kernel_size=1, stride=1, dropout=dropout, bias=True, conv_only=True
- )
-
- def forward(self, inp):
- return self.conv(inp)
-
-
-def get_conv_layer(
- spatial_dims: int,
- in_channels: int,
- out_channels: int,
- kernel_size: Union[Sequence[int], int] = 3,
- stride: Union[Sequence[int], int] = 1,
- act: Optional[Union[Tuple, str]] = Act.PRELU,
- norm: Union[Tuple, str] = Norm.INSTANCE,
- dropout: Optional[Union[Tuple, str, float]] = None,
- bias: bool = False,
- conv_only: bool = True,
- is_transposed: bool = False,
-):
- padding = get_padding(kernel_size, stride)
- output_padding = None
- if is_transposed:
- output_padding = get_output_padding(kernel_size, stride, padding)
- return Convolution(
- spatial_dims,
- in_channels,
- out_channels,
- strides=stride,
- kernel_size=kernel_size,
- act=act,
- norm=norm,
- dropout=dropout,
- bias=bias,
- conv_only=conv_only,
- is_transposed=is_transposed,
- padding=padding,
- output_padding=output_padding,
- )
-
-
-def get_padding(
- kernel_size: Union[Sequence[int], int], stride: Union[Sequence[int], int]
-) -> Union[Tuple[int, ...], int]:
-
- kernel_size_np = np.atleast_1d(kernel_size)
- stride_np = np.atleast_1d(stride)
- padding_np = (kernel_size_np - stride_np + 1) / 2
- if np.min(padding_np) < 0:
- raise AssertionError("padding value should not be negative, please change the kernel size and/or stride.")
- padding = tuple(int(p) for p in padding_np)
-
- return padding if len(padding) > 1 else padding[0]
-
-
-def get_output_padding(
- kernel_size: Union[Sequence[int], int], stride: Union[Sequence[int], int], padding: Union[Sequence[int], int]
-) -> Union[Tuple[int, ...], int]:
- kernel_size_np = np.atleast_1d(kernel_size)
- stride_np = np.atleast_1d(stride)
- padding_np = np.atleast_1d(padding)
-
- out_padding_np = 2 * padding_np + stride_np - kernel_size_np
- if np.min(out_padding_np) < 0:
- raise AssertionError("out_padding value should not be negative, please change the kernel size and/or stride.")
- out_padding = tuple(int(p) for p in out_padding_np)
-
- return out_padding if len(out_padding) > 1 else out_padding[0]
diff --git a/pymic/net_run/__init__.py b/pymic/net_run/__init__.py
deleted file mode 100644
index e69de29..0000000
diff --git a/pymic/net_run/agent_abstract.py b/pymic/net_run/agent_abstract.py
deleted file mode 100644
index be24b41..0000000
--- a/pymic/net_run/agent_abstract.py
+++ /dev/null
@@ -1,346 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-
-import os
-import random
-import logging
-import torch
-import numpy as np
-import torch.optim as optim
-from abc import ABCMeta, abstractmethod
-from pymic.net_run.get_optimizer import get_lr_scheduler, get_optimizer
-
-def seed_torch(seed=1):
- """
- Set random seed.
-
- :param seed: (int) the seed for random.
- """
- random.seed(seed)
- os.environ['PYTHONHASHSEED'] = str(seed)
- np.random.seed(seed)
- torch.manual_seed(seed)
- torch.cuda.manual_seed(seed)
- torch.cuda.manual_seed_all(seed) # if using multi-GPU.
- torch.backends.cudnn.benchmark = False
- torch.backends.cudnn.deterministic = True
-
-def worker_init_fn(worker_id):
- # workder_seed = self.random_seed+worker_id
- workder_seed = torch.initial_seed() % 2 ** 32
- np.random.seed(workder_seed)
- random.seed(workder_seed)
-
-class NetRunAgent(object):
- """
- The abstract class for medical image segmentation.
-
- :param config: (dict) A dictionary containing the configuration.
- :param stage: (str) One of the stage in `train` (default), `inference` or `test`.
-
- .. note::
-
- The config dictionary should have at least four sections: `dataset`,
- `network`, `training` and `inference`. See :doc:`usage.quickstart` and
- :doc:`usage.fsl` for example.
-
- """
- __metaclass__ = ABCMeta
- def __init__(self, config, stage = 'train'):
- assert(stage in ['train', 'inference', 'test'])
- self.config = config
- self.stage = stage
- if(stage == 'inference'):
- self.stage = 'test'
- self.train_set = None
- self.valid_set = None
- self.test_set = None
- self.net = None
- self.optimizer = None
- self.scheduler = None
- self.net_dict = None
- self.loss_dict = None
- self.transform_dict = None
- self.inferer = None
- self.postprocess_dict = None
- self.postprocessor = None
- self.tensor_type = config['dataset']['tensor_type']
- self.task_type = config['dataset']['task_type']
- self.deterministic = config['training'].get('deterministic', True)
- self.random_seed = config['training'].get('random_seed', 1)
- if(self.deterministic):
- seed_torch(self.random_seed)
- logging.info("deterministric is true")
-
-
- def set_datasets(self, train_set, valid_set, test_set):
- """
- Set customized datasets for training and inference.
-
- :param train_set: (torch.utils.data.Dataset) The training set.
- :param valid_set: (torch.utils.data.Dataset) The validation set.
- :param test_set: (torch.utils.data.Dataset) The testing set.
- """
- self.train_set = train_set
- self.valid_set = valid_set
- self.test_set = test_set
-
- def set_transform_dict(self, custom_transform_dict):
- """
- Set the available Transforms, including customized Transforms.
-
- :param custom_transform_dict: (dictionary) A dictionary of
- available Transforms.
- """
- self.transform_dict = custom_transform_dict
-
- def set_network(self, net):
- """
- Set the network.
-
- :param net: (nn.Module) A deep learning network.
- """
- self.net = net
-
- def set_net_dict(self, net_dict):
- """
- Set the available networks, including customized networks.
-
- :param net_dict: (dictionary) A dictionary of available networks.
- """
- self.net_dict = net_dict
-
- def set_postprocess_dict(self, postprocess_dict):
- """
- Set the available methods for postprocess, including customized postprocess methods.
-
- :param postprocess_dict: (dictionary) A dictionary of available postprocess methods.
- """
- self.postprocess_dict = postprocess_dict
-
- def set_loss_dict(self, loss_dict):
- """
- Set the available loss functions, including customized loss functions.
-
- :param loss_dict: (dictionary) A dictionary of available loss functions.
- """
- self.loss_dict = loss_dict
-
- def set_optimizer(self, optimizer):
- """
- Set the optimizer.
-
- :param optimizer: An optimizer.
- """
- self.optimizer = optimizer
-
- def set_scheduler(self, scheduler):
- """
- Set the learning rate scheduler.
-
- :param scheduler: A learning rate scheduler.
- """
- self.scheduler = scheduler
-
- def set_inferer(self, inferer):
- """
- Set the inferer.
-
- :param inferer: An inferer object.
- """
- self.inferer = inferer
-
- def get_checkpoint_name(self):
- """
- Get the checkpoint name for inference based on config['testing']['ckpt_mode'].
- """
- ckpt_mode = self.config['testing']['ckpt_mode']
- if(ckpt_mode == 0 or ckpt_mode == 1):
- ckpt_dir = self.config['training']['ckpt_dir']
- ckpt_prefix = self.config['training'].get('ckpt_prefix', None)
- if(ckpt_prefix is None):
- ckpt_prefix = ckpt_dir.split('/')[-1]
- txt_name = ckpt_dir + '/' + ckpt_prefix
- txt_name += "_latest.txt" if ckpt_mode == 0 else "_best.txt"
- with open(txt_name, 'r') as txt_file:
- it_num = txt_file.read().replace('\n', '')
- ckpt_name = "{0:}/{1:}_{2:}.pt".format(ckpt_dir, ckpt_prefix, it_num)
- if(ckpt_mode == 1 and not os.path.isfile(ckpt_name)):
- ckpt_name = "{0:}/{1:}_best.pt".format(ckpt_dir, ckpt_prefix)
- else:
- ckpt_name = self.config['testing']['ckpt_name']
- return ckpt_name
-
- @abstractmethod
- def get_stage_transform_from_config(self, stage):
- """
- Get the transform list required by dataset for training, validation or inference stage.
-
- :param stage: (str) `train`, `valid` or `test`.
- """
- raise(ValueError("not implemented"))
-
- @abstractmethod
- def get_stage_dataset_from_config(self, stage):
- """
- Create dataset based on training, validation or inference stage.
-
- :param stage: (str) `train`, `valid` or `test`.
- """
- raise(ValueError("not implemented"))
-
- @abstractmethod
- def get_parameters_to_update(self):
- """
- Get parameters for update.
- """
- raise(ValueError("not implemented"))
-
- @abstractmethod
- def get_loss_value(self, data, pred, gt, param = None):
- """
- Get the loss value. Assume `pred` and `gt` has been sent to self.device.
- `data` is obtained by dataloader, and is a dictionary containing extra
- information, such as pixel-level weight. By default, such information
- is not used by standard loss functions such as Dice loss and cross entropy loss.
-
-
- :param data: (dictionary) A data dictionary obtained by dataloader.
- :param pred: (tensor) Prediction result by the network.
- :param gt: (tensor) Ground truth.
- :param param: (dictionary) Other parameters if needed.
- """
- raise(ValueError("not implemented"))
-
- @abstractmethod
- def create_network(self):
- """
- Create network based on configuration.
- """
- raise(ValueError("not implemented"))
-
- @abstractmethod
- def create_loss_calculator(self):
- """
- Create loss function object.
- """
- raise(ValueError("not implemented"))
-
- @abstractmethod
- def training(self):
- """
- Train the network
- """
- raise(ValueError("not implemented"))
-
- @abstractmethod
- def validation(self):
- """
- Evaluate the performance on the validation set.
- """
- raise(ValueError("not implemented"))
-
- @abstractmethod
- def train_valid(self):
- """
- Train and valid.
- """
- raise(ValueError("not implemented"))
-
- @abstractmethod
- def infer(self):
- """
- Inference on testing set.
- """
- raise(ValueError("not implemented"))
-
- @abstractmethod
- def write_scalars(self, train_scalars, valid_scalars, lr_value, glob_it):
- """
- Write scalars using SummaryWriter.
-
- :param train_scalars: (dictionary) Scalars for training set.
- :param valid_scalars: (dictionary) Scalars for validation set.
- :param lr_value: (float) Current learning rate.
- :param glob_it: (int) Current iteration number.
- """
- raise(ValueError("not implemented"))
-
- def create_dataset(self):
- """
- Create datasets for training, validation or testing based on configuraiton.
- """
- if(self.stage == 'train'):
- if(self.train_set is None):
- self.train_set = self.get_stage_dataset_from_config('train')
- if(self.valid_set is None):
- valid_csv = self.config['dataset'].get('valid_csv', None)
- if valid_csv is not None:
- self.valid_set = self.get_stage_dataset_from_config('valid')
- else:
- logging.warning("Dataset for validation is not created, as valid_dir is not provided.")
- if(self.deterministic):
- worker_init = worker_init_fn
- else:
- worker_init = None
-
- num_worker = self.config['dataset'].get('num_worker', 8)
- bn_train = self.config['dataset']['train_batch_size']
- g_train = torch.Generator()
- g_train.manual_seed(self.random_seed)
- self.train_loader = torch.utils.data.DataLoader(self.train_set,
- batch_size = bn_train, shuffle=True, num_workers= num_worker,
- worker_init_fn=worker_init, generator = g_train, drop_last = True)
- if(self.valid_set is not None):
- bn_valid = self.config['dataset'].get('valid_batch_size', 1)
- g_valid = torch.Generator()
- g_valid.manual_seed(self.random_seed)
- self.valid_loader = torch.utils.data.DataLoader(self.valid_set,
- batch_size = bn_valid, shuffle=False, num_workers= num_worker,
- worker_init_fn=worker_init, generator = g_valid)
- else:
- bn_test = self.config['dataset'].get('test_batch_size', 1)
- if(self.test_set is None):
- self.test_set = self.get_stage_dataset_from_config('test')
- self.test_loader = torch.utils.data.DataLoader(self.test_set,
- batch_size = bn_test, shuffle=False, num_workers= bn_test)
-
- def create_optimizer(self, params, checkpoint = None):
- """
- Create optimizer based on configuration.
-
- :param params: network parameters for optimization. Usually it is obtained by
- `self.get_parameters_to_update()`.
- """
- opt_params = self.config['training']
- if(self.optimizer is None):
- self.optimizer = get_optimizer(opt_params['optimizer'],
- params, opt_params)
- last_iter = -1
- if(checkpoint is not None):
- self.optimizer.load_state_dict(checkpoint['optimizer_state_dict'])
- last_iter = checkpoint['iteration'] - 1
- if(self.scheduler is None):
- opt_params["last_iter"] = last_iter
- self.scheduler = get_lr_scheduler(self.optimizer, opt_params)
-
- def convert_tensor_type(self, input_tensor):
- """
- Convert the type of an input tensor to float or double based on configuration.
- """
- if(self.tensor_type == 'float'):
- return input_tensor.float()
- else:
- return input_tensor.double()
-
- def run(self):
- """
- Run the training or inference code according to configuration.
- """
- self.create_dataset()
- self.create_network()
- if(self.stage == 'train'):
- self.train_valid()
- else:
- self.infer()
-
diff --git a/pymic/net_run/agent_cls.py b/pymic/net_run/agent_cls.py
deleted file mode 100644
index 728f805..0000000
--- a/pymic/net_run/agent_cls.py
+++ /dev/null
@@ -1,410 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-
-import copy
-import csv
-import logging
-import time
-import numpy as np
-import torch
-import torch.nn as nn
-from datetime import datetime
-from random import random
-from torch.optim import lr_scheduler
-from torchvision import transforms
-from tensorboardX import SummaryWriter
-from pymic import TaskType
-from pymic.io.nifty_dataset import ClassificationDataset
-from pymic.loss.loss_dict_cls import PyMICClsLossDict
-from pymic.net.net_dict_cls import TorchClsNetDict
-from pymic.transform.trans_dict import TransformDict
-from pymic.net_run.agent_abstract import NetRunAgent
-from pymic.util.general import mixup, tensor_shape_match
-import warnings
-warnings.filterwarnings('ignore', '.*output shape of zoom.*')
-
-class ClassificationAgent(NetRunAgent):
- """
- The agent for image classificaiton tasks.
-
- :param config: (dict) A dictionary containing the configuration.
- :param stage: (str) One of the stage in `train` (default), `inference` or `test`.
-
- .. note::
-
- The config dictionary should have at least four sections: `dataset`,
- `network`, `training` and `inference`. See :doc:`usage.quickstart` and
- :doc:`usage.fsl` for example.
- """
- def __init__(self, config, stage = 'train'):
- super(ClassificationAgent, self).__init__(config, stage)
- self.transform_dict = TransformDict
-
- def get_stage_dataset_from_config(self, stage):
- assert(stage in ['train', 'valid', 'test'])
- root_dir = self.config['dataset']['root_dir']
- modal_num = self.config['dataset']['modal_num']
-
- if(stage == "train"):
- transform_names = self.config['dataset']['train_transform']
- elif(stage == "valid"):
- transform_names = self.config['dataset']['valid_transform']
- elif(stage == "test"):
- transform_names = self.config['dataset']['test_transform']
- else:
- raise ValueError("Incorrect value for stage: {0:}".format(stage))
- self.transform_list = []
- if(transform_names is None or len(transform_names) == 0):
- data_transform = None
- else:
- transform_param = self.config['dataset']
- transform_param['task'] = self.task_type
- for name in transform_names:
- if(name not in self.transform_dict):
- raise(ValueError("Undefined transform {0:}".format(name)))
- one_transform = self.transform_dict[name](transform_param)
- self.transform_list.append(one_transform)
- data_transform = transforms.Compose(self.transform_list)
-
- csv_file = self.config['dataset'].get(stage + '_csv', None)
- class_num = self.config['network']['class_num']
- dataset = ClassificationDataset(root_dir=root_dir,
- csv_file = csv_file,
- modal_num = modal_num,
- class_num = class_num,
- with_label= not (stage == 'test'),
- transform = data_transform,
- task = self.task_type)
- return dataset
-
- def create_network(self):
- if(self.net is None):
- net_name = self.config['network']['net_type']
- if(net_name not in TorchClsNetDict):
- raise ValueError("Undefined network {0:}".format(net_name))
- self.net = TorchClsNetDict[net_name](self.config['network'])
- if(self.tensor_type == 'float'):
- self.net.float()
- else:
- self.net.double()
- param_number = sum(p.numel() for p in self.net.parameters() if p.requires_grad)
- logging.info('parameter number {0:}'.format(param_number))
-
- def get_parameters_to_update(self):
- params = self.net.get_parameters_to_update()
- return params
-
- def create_loss_calculator(self):
- if(self.loss_dict is None):
- self.loss_dict = PyMICClsLossDict
- loss_name = self.config['training']['loss_type']
- if(loss_name != "SigmoidCELoss" and self.task_type == TaskType.CLASSIFICATION_COEXIST):
- raise ValueError("SigmoidCELoss should be used when task_type is cls_coexist")
- if(loss_name in self.loss_dict):
- self.loss_calculater = self.loss_dict[loss_name](self.config['training'])
- else:
- raise ValueError("Undefined loss function {0:}".format(loss_name))
-
- def get_loss_value(self, data, pred, gt, param = None):
- loss_input_dict = {}
- loss_input_dict['prediction'] = pred
- loss_input_dict['ground_truth'] = gt
- loss_value = self.loss_calculater(loss_input_dict)
- return loss_value
-
- def get_evaluation_score(self, outputs, labels):
- """
- Get evaluation score for a prediction.
-
- :param outputs: (tensor) Prediction obtained by a network with size N X C.
- :param labels: (tensor) The ground truth with size N X C.
- """
- metrics = self.config['training'].get("evaluation_metric", "accuracy")
- if(metrics != "accuracy"): # default classification accuracy
- raise ValueError("Not implemeted for metric {0:}".format(metrics))
- if(self.task_type == TaskType.CLASSIFICATION_ONE_HOT):
- out_argmax = torch.argmax(outputs, 1)
- lab_argmax = torch.argmax(labels, 1)
- consis = self.convert_tensor_type(out_argmax == lab_argmax)
- score = torch.mean(consis)
- elif(self.task_type == TaskType.CLASSIFICATION_COEXIST):
- preds = self.convert_tensor_type(outputs > 0.5)
- consis= self.convert_tensor_type(preds == labels.data)
- score = torch.mean(consis)
- return score
-
- def training(self):
- iter_valid = self.config['training']['iter_valid']
- mixup_prob = self.config['training'].get('mixup_probability', 0.5)
- sample_num = 0
- running_loss = 0
- running_score= 0
- self.net.train()
- for it in range(iter_valid):
- try:
- data = next(self.trainIter)
- except StopIteration:
- self.trainIter = iter(self.train_loader)
- data = next(self.trainIter)
- inputs = self.convert_tensor_type(data['image'])
- labels = self.convert_tensor_type(data['label_prob'])
- if(random() < mixup_prob):
- inputs, labels = mixup(inputs, labels)
- inputs, labels = inputs.to(self.device), labels.to(self.device)
-
- # zero the parameter gradients
- self.optimizer.zero_grad()
- # forward + backward + optimize
- outputs = self.net(inputs)
-
- loss = self.get_loss_value(data, outputs, labels)
- loss.backward()
- self.optimizer.step()
-
- # statistics
- sample_num += labels.size(0)
- running_loss += loss.item() * labels.size(0)
- running_score+= self.get_evaluation_score(outputs, labels) * labels.size(0)
-
- avg_loss = running_loss / sample_num
- avg_score= running_score.double() / sample_num
- metrics =self.config['training'].get("evaluation_metric", "accuracy")
- train_scalers = {'loss': avg_loss, metrics: avg_score}
- return train_scalers
-
- def validation(self):
- validIter = iter(self.valid_loader)
- sample_num = 0
- running_loss = 0
- running_score= 0
- with torch.no_grad():
- self.net.eval()
- for data in validIter:
- inputs = self.convert_tensor_type(data['image'])
- labels = self.convert_tensor_type(data['label_prob'])
- inputs, labels = inputs.to(self.device), labels.to(self.device)
- # self.optimizer.zero_grad()
- # forward + backward + optimize
- outputs = self.net(inputs)
- loss = self.get_loss_value(data, outputs, labels)
-
- # statistics
- sample_num += labels.size(0)
- running_loss += loss.item() * labels.size(0)
- running_score+= self.get_evaluation_score(outputs, labels) * labels.size(0)
-
- avg_loss = running_loss / sample_num
- avg_score= running_score.double() / sample_num
- metrics = self.config['training'].get("evaluation_metric", "accuracy")
- valid_scalers = {'loss': avg_loss, metrics: avg_score}
- return valid_scalers
-
- def write_scalars(self, train_scalars, valid_scalars, lr_value, glob_it):
- metrics = self.config['training'].get("evaluation_metric", "accuracy")
- loss_scalar ={'train':train_scalars['loss'], 'valid':valid_scalars['loss']}
- acc_scalar ={'train':train_scalars[metrics],'valid':valid_scalars[metrics]}
- self.summ_writer.add_scalars('loss', loss_scalar, glob_it)
- self.summ_writer.add_scalars(metrics, acc_scalar, glob_it)
- self.summ_writer.add_scalars('lr', {"lr": lr_value}, glob_it)
-
- logging.info('train loss {0:.4f}, avg {1:} {2:.4f}'.format(
- train_scalars['loss'], metrics, train_scalars[metrics]))
- logging.info('valid loss {0:.4f}, avg {1:} {2:.4f}'.format(
- valid_scalars['loss'], metrics, valid_scalars[metrics]))
-
- def load_pretrained_weights(self, network, pretrained_dict, device_ids):
- if(len(device_ids) > 1):
- if(hasattr(network.module, "get_parameters_to_load")):
- model_dict = network.module.get_parameters_to_load()
- else:
- model_dict = network.module.state_dict()
- else:
- if(hasattr(network, "get_parameters_to_load")):
- model_dict = network.get_parameters_to_load()
- else:
- model_dict = network.state_dict()
- pretrained_dict = {k: v for k, v in pretrained_dict.items() if \
- k in model_dict and tensor_shape_match(pretrained_dict[k], model_dict[k])}
- logging.info("Initializing the following parameters with pre-trained model")
- for k in pretrained_dict:
- logging.info(k)
- if (len(device_ids) > 1):
- network.module.load_state_dict(pretrained_dict, strict = False)
- else:
- network.load_state_dict(pretrained_dict, strict = False)
-
- def train_valid(self):
- device_ids = self.config['training']['gpus']
- if(len(device_ids) > 1):
- self.device = torch.device("cuda:0")
- self.net = nn.DataParallel(self.net, device_ids = device_ids)
- else:
- self.device = torch.device("cuda:{0:}".format(device_ids[0]))
- self.net.to(self.device)
-
- ckpt_dir = self.config['training']['ckpt_dir']
- if(ckpt_dir[-1] == "/"):
- ckpt_dir = ckpt_dir[:-1]
- ckpt_prefix = self.config['training'].get('ckpt_prefix', None)
- if(ckpt_prefix is None):
- ckpt_prefix = ckpt_dir.split('/')[-1]
- iter_start = 0
- iter_max = self.config['training']['iter_max']
- iter_valid = self.config['training']['iter_valid']
- iter_save = self.config['training']['iter_save']
- early_stop_it = self.config['training'].get('early_stop_patience', None)
- metrics = self.config['training'].get("evaluation_metric", "accuracy")
- if(iter_save is None):
- iter_save_list = [iter_max]
- elif(isinstance(iter_save, (tuple, list))):
- iter_save_list = iter_save
- else:
- iter_save_list = range(0, iter_max + 1, iter_save)
-
- self.max_val_score = 0.0
- self.max_val_it = 0
- self.best_model_wts = None
- ckpt_init_name = self.config['training'].get('ckpt_init_name', None)
- ckpt_init_mode = self.config['training'].get('ckpt_init_mode', 0)
-
- if(ckpt_init_name is not None):
- checkpoint = torch.load(ckpt_dir + "/" + ckpt_init_name, map_location = self.device)
- pretrained_dict = checkpoint['model_state_dict']
- self.load_pretrained_weights(self.net, pretrained_dict, device_ids)
- if(ckpt_init_mode > 0): # Load other information
- iter_start = checkpoint['iteration']
- self.max_val_score = checkpoint.get('valid_pred', 0)
- self.max_val_it = checkpoint['iteration']
- self.best_model_wts = checkpoint['model_state_dict']
-
- self.create_optimizer(self.get_parameters_to_update())
- self.create_loss_calculator()
-
- self.trainIter = iter(self.train_loader)
-
- logging.info("{0:} training start".format(str(datetime.now())[:-7]))
- self.summ_writer = SummaryWriter(self.config['training']['ckpt_dir'])
- self.glob_it = iter_start
- for it in range(iter_start, iter_max, iter_valid):
- lr_value = self.optimizer.param_groups[0]['lr']
- t0 = time.time()
- train_scalars = self.training()
- t1 = time.time()
- valid_scalars = self.validation()
-
- t2 = time.time()
- if(isinstance(self.scheduler, lr_scheduler.ReduceLROnPlateau)):
- self.scheduler.step(valid_scalars[metrics])
- else:
- self.scheduler.step()
-
- self.glob_it = it + iter_valid
- logging.info("\n{0:} it {1:}".format(str(datetime.now())[:-7], self.glob_it))
- logging.info('learning rate {0:}'.format(lr_value))
- logging.info("training/validation time: {0:.2f}s/{1:.2f}s".format(t1-t0, t2-t1))
- self.write_scalars(train_scalars, valid_scalars, lr_value, self.glob_it)
- if(valid_scalars[metrics] > self.max_val_score):
- self.max_val_score = valid_scalars[metrics]
- self.max_val_it = self.glob_it
- if(len(device_ids) > 1):
- self.best_model_wts = copy.deepcopy(self.net.module.state_dict())
- else:
- self.best_model_wts = copy.deepcopy(self.net.state_dict())
- save_dict = {'iteration': self.max_val_it,
- 'valid_pred': self.max_val_score,
- 'model_state_dict': self.best_model_wts,
- 'optimizer_state_dict': self.optimizer.state_dict()}
- save_name = "{0:}/{1:}_best.pt".format(ckpt_dir, ckpt_prefix)
- torch.save(save_dict, save_name)
- txt_file = open("{0:}/{1:}_best.txt".format(ckpt_dir, ckpt_prefix), 'wt')
- txt_file.write(str(self.max_val_it))
- txt_file.close()
-
- stop_now = True if(early_stop_it is not None and \
- self.glob_it - self.max_val_it > early_stop_it) else False
-
- if ((self.glob_it in iter_save_list) or stop_now):
- save_dict = {'iteration': self.glob_it,
- 'valid_pred': valid_scalars[metrics],
- 'model_state_dict': self.net.state_dict(),
- 'optimizer_state_dict': self.optimizer.state_dict()}
- save_name = "{0:}/{1:}_{2:}.pt".format(ckpt_dir, ckpt_prefix, self.glob_it)
- torch.save(save_dict, save_name)
- txt_file = open("{0:}/{1:}_latest.txt".format(ckpt_dir, ckpt_prefix), 'wt')
- txt_file.write(str(self.glob_it))
- txt_file.close()
- if(stop_now):
- logging.info("The training is early stopped")
- break
- logging.info('The best perfroming iter is {0:}, valid {1:} {2:}'.format(\
- self.max_val_it, metrics, self.max_val_score))
- self.summ_writer.close()
-
- def infer(self):
- device_ids = self.config['testing']['gpus']
- device = torch.device("cuda:{0:}".format(device_ids[0]))
- self.net.to(device)
- # load network parameters and set the network as evaluation mode
- checkpoint_name = self.get_checkpoint_name()
- checkpoint = torch.load(checkpoint_name, map_location = device)
- self.net.load_state_dict(checkpoint['model_state_dict'])
-
- if(self.config['testing'].get('evaluation_mode', True)):
- self.net.eval()
-
- output_csv = self.config['testing']['output_dir'] + '/' + self.config['testing']['output_csv']
- class_num = self.config['network']['class_num']
- save_probability = self.config['testing'].get('save_probability', False)
-
- infer_time_list = []
- out_prob_list = []
- out_lab_list = []
- with torch.no_grad():
- for data in self.test_loader:
- names = data['names']
- inputs = self.convert_tensor_type(data['image'])
- inputs = inputs.to(device)
-
- start_time = time.time()
- out_digit = self.net(inputs)
- infer_time = time.time() - start_time
- infer_time_list.append(infer_time)
-
- if (self.task_type == TaskType.CLASSIFICATION_ONE_HOT):
- out_prob = nn.Softmax(dim = 1)(out_digit).detach().cpu().numpy()
- out_lab = np.argmax(out_prob, axis=1)
- else: #self.task_type == TaskType.CLASSIFICATION_COEXIST
- out_prob = nn.Sigmoid()(out_digit).detach().cpu().numpy()
- out_lab = np.asarray(out_prob > 0.5, np.uint8)
- for i in range(len(names)):
- print(names[i], out_lab[i])
- if(self.task_type == TaskType.CLASSIFICATION_ONE_HOT):
- out_lab_list.append([names[i]] + [out_lab[i]])
- else:
- out_lab_list.append([names[i]] + out_lab[i].tolist())
- out_prob_list.append([names[i]] + out_prob[i].tolist())
-
- with open(output_csv, mode='w') as csv_file:
- csv_writer = csv.writer(csv_file, delimiter=',',
- quotechar='"',quoting=csv.QUOTE_MINIMAL)
- head = ['image', 'label']
- if(len(out_lab_list[0]) > 2):
- head = ['image'] + ['label{0:}'.format(i) for i in range(class_num)]
- csv_writer.writerow(head)
- for item in out_lab_list:
- csv_writer.writerow(item)
- if(save_probability):
- prob_csv = output_csv.replace(".csv", "_prob.csv")
- with open(prob_csv, mode='w') as csv_file:
- csv_writer = csv.writer(csv_file, delimiter=',',
- quotechar='"',quoting=csv.QUOTE_MINIMAL)
- head = ['image']+['prob{}'.format(i) for i in range(class_num)]
- csv_writer.writerow(head)
- for item in out_prob_list:
- csv_writer.writerow(item)
-
- infer_time_list = np.asarray(infer_time_list)
- time_avg = infer_time_list.mean()
- time_std = infer_time_list.std()
- print("testing time {0:} +/- {1:}".format(time_avg, time_std))
-
diff --git a/pymic/net_run/agent_preprocess.py b/pymic/net_run/agent_preprocess.py
deleted file mode 100644
index c53421f..0000000
--- a/pymic/net_run/agent_preprocess.py
+++ /dev/null
@@ -1,130 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-import os
-import sys
-import torch
-import torchvision.transforms as transforms
-from pymic.util.parse_config import *
-from pymic.io.image_read_write import save_nd_array_as_image
-from pymic.io.nifty_dataset import NiftyDataset
-from pymic.transform.trans_dict import TransformDict
-from pymic.net_run.agent_abstract import seed_torch
-from pymic.net_run.self_sup.util import volume_fusion, nonlienar_volume_fusion,augmented_volume_fusion,self_volume_fusion
-
-class PreprocessAgent(object):
- def __init__(self, config):
- super(PreprocessAgent, self).__init__()
- self.config = config
- self.transform_dict = TransformDict
- self.task_type = config['dataset']['task_type']
- self.dataloader = None
- self.dataloader_unlab= None
-
- deterministic = config['dataset'].get('deterministic', True)
- if(deterministic):
- random_seed = config['dataset'].get('random_seed', 1)
- seed_torch(random_seed)
-
- def get_dataset_from_config(self):
- root_dir = self.config['dataset']['data_dir']
- modal_num = self.config['dataset'].get('modal_num', 1)
- transform_names = self.config['dataset']["transform"]
-
- self.transform_list = []
- if(transform_names is None or len(transform_names) == 0):
- data_transform = None
- else:
- transform_param = self.config['dataset']
- transform_param['task'] = self.task_type
- for name in transform_names:
- if(name not in self.transform_dict):
- raise(ValueError("Undefined transform {0:}".format(name)))
- one_transform = self.transform_dict[name](transform_param)
- self.transform_list.append(one_transform)
- data_transform = transforms.Compose(self.transform_list)
-
- data_csv = self.config['dataset'].get('data_csv', None)
- data_csv_unlab = self.config['dataset'].get('data_csv_unlab', None)
- batch_size = self.config['dataset'].get('batch_size', 1)
- data_shuffle = self.config['dataset'].get('data_shuffle', False)
- if(data_csv is not None):
- dataset = NiftyDataset(root_dir = root_dir,
- csv_file = data_csv,
- modal_num = modal_num,
- with_label= True,
- transform = data_transform,
- task = self.task_type)
- self.dataloader = torch.utils.data.DataLoader(dataset,
- batch_size = batch_size, shuffle=data_shuffle, num_workers= 8,
- worker_init_fn=None, generator = torch.Generator())
- if(data_csv_unlab is not None):
- dataset_unlab = NiftyDataset(root_dir = root_dir,
- csv_file = data_csv_unlab,
- modal_num = modal_num,
- with_label= False,
- transform = data_transform,
- task = self.task_type)
- self.dataloader_unlab = torch.utils.data.DataLoader(dataset_unlab,
- batch_size = batch_size, shuffle=data_shuffle, num_workers= 8,
- worker_init_fn=None, generator = torch.Generator())
-
- def run(self):
- """
- Do preprocessing for labeled and unlabeled data.
- """
- self.get_dataset_from_config()
- out_dir = self.config['dataset']['output_dir']
- modal_num = self.config['dataset']['modal_num']
- if(not os.path.isdir(out_dir)):
- os.mkdir(out_dir)
- batch_operation = self.config['dataset'].get('batch_operation', None)
- for dataloader in [self.dataloader, self.dataloader_unlab]:
- if(dataloader is None):
- continue
- for data in dataloader:
- inputs = data['image']
- labels = data.get('label', None)
- img_names = data['names']
- if(len(img_names) == modal_num): # for unlabeled dataset
- lab_names = [item.replace(".nii.gz", "_lab.nii.gz") for item in img_names[0]]
- else:
- lab_names = img_names[-1]
- B, C = inputs.shape[0], inputs.shape[1]
- spacing = [x.numpy()[0] for x in data['spacing']]
-
- if(batch_operation is not None):
- if('VolumeFusion' in batch_operation):
- class_num = self.config['dataset']['VolumeFusion_cls_num'.lower()]
- block_range = self.config['dataset']['VolumeFusion_block_range'.lower()]
- size_min = self.config['dataset']['VolumeFusion_size_min'.lower()]
- size_max = self.config['dataset']['VolumeFusion_size_max'.lower()]
- inputs, labels = volume_fusion(inputs, class_num - 1, block_range, size_min, size_max)
- elif('SelfVolumeFusion' in batch_operation):
- class_num = self.config['dataset']['SelfVolumeFusion_cls_num'.lower()]
- fuse_ratio = self.config['dataset']['SelfVolumeFusion_fuse_ratio'.lower()]
- size_min = self.config['dataset']['SelfVolumeFusion_size_min'.lower()]
- size_max = self.config['dataset']['SelfVolumeFusion_size_max'.lower()]
- inputs, labels = self_volume_fusion(inputs, class_num - 1, fuse_ratio, size_min, size_max)
- elif('NonLinearVolumeFusion' in batch_operation):
- block_range = self.config['dataset']['NonLinearVolumeFusion_block_range'.lower()]
- size_min = self.config['dataset']['NonLinearVolumeFusion_size_min'.lower()]
- size_max = self.config['dataset']['NonLinearVolumeFusion_size_max'.lower()]
- inputs, labels = nonlienar_volume_fusion(inputs, block_range, size_min, size_max)
- elif('AugmentedVolumeFusion' in batch_operation):
- size_min = self.config['dataset']['AugmentedVolumeFusion_size_min'.lower()]
- size_max = self.config['dataset']['AugmentedVolumeFusion_size_max'.lower()]
- inputs, labels = augmented_volume_fusion(inputs, size_min, size_max)
-
- for b in range(B):
- for c in range(C):
- image_name = out_dir + "/" + img_names[c][b]
- print(image_name)
- out_dir_full = "/".join(image_name.split("/")[:-1])
- print(out_dir_full)
- if(not os.path.exists(out_dir_full)):
- os.mkdir(out_dir_full)
- save_nd_array_as_image(inputs[b][c], image_name, reference_name = None, spacing=spacing)
- if(labels is not None):
- label_name = out_dir + "/" + lab_names[b]
- print(label_name)
- save_nd_array_as_image(labels[b][0], label_name, reference_name = None, spacing=spacing)
diff --git a/pymic/net_run/agent_rec.py b/pymic/net_run/agent_rec.py
deleted file mode 100644
index 0d78b43..0000000
--- a/pymic/net_run/agent_rec.py
+++ /dev/null
@@ -1,336 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-import copy
-import logging
-import time
-import logging
-import numpy as np
-import os
-import scipy
-import torch
-import torch.nn as nn
-from datetime import datetime
-from torch.optim import lr_scheduler
-from tensorboardX import SummaryWriter
-from pymic.io.image_read_write import save_nd_array_as_image
-from pymic.net_run.infer_func import Inferer
-from pymic.net_run.agent_seg import SegmentationAgent
-from pymic.loss.seg.mse import MAELoss, MSELoss
-from pymic.util.general import mixup, tensor_shape_match
-
-ReconstructionLossDict = {
- 'MAELoss': MAELoss,
- 'MSELoss': MSELoss
- }
-
-class ReconstructionAgent(SegmentationAgent):
- """
- An agent for image reconstruction (pixel-level intensity prediction).
- """
- def __init__(self, config, stage = 'train'):
- super(ReconstructionAgent, self).__init__(config, stage)
- if (self.config['network']['class_num'] != 1):
- raise ValueError("For reconstruction tasks, the output channel number should be 1, " +
- "but {} was given.".format(self.config['network']['class_num']))
-
- def create_loss_calculator(self):
- if(self.loss_dict is None):
- self.loss_dict = ReconstructionLossDict
- loss_name = self.config['training']['loss_type']
- if isinstance(loss_name, (list, tuple)):
- raise ValueError("Undefined loss function {0:}".format(loss_name))
- elif (loss_name not in self.loss_dict):
- raise ValueError("Undefined loss function {0:}".format(loss_name))
- else:
- loss_param = self.config['training']
- base_loss = self.loss_dict[loss_name](self.config['training'])
- if(self.config['training'].get('deep_supervise', False)):
- raise ValueError("Deep supervised loss not implemented for reconstruction tasks")
- # weight = self.config['training'].get('deep_supervise_weight', None)
- # mode = self.config['training'].get('deep_supervise_mode', 2)
- # params = {'deep_supervise_weight': weight,
- # 'deep_supervise_mode': mode,
- # 'base_loss':base_loss}
- # self.loss_calculator = DeepSuperviseLoss(params)
- else:
- self.loss_calculator = base_loss
-
- def training(self):
- iter_valid = self.config['training']['iter_valid']
- train_loss = 0
- data_time, gpu_time, loss_time, back_time = 0, 0, 0, 0
- self.net.train()
- for it in range(iter_valid):
- t0 = time.time()
- try:
- data = next(self.trainIter)
- except StopIteration:
- self.trainIter = iter(self.train_loader)
- data = next(self.trainIter)
- # get the inputs
- t1 = time.time()
- inputs = self.convert_tensor_type(data['image'])
- label = self.convert_tensor_type(data['label'])
-
- # for debug
- # from pymic.io.image_read_write import save_nd_array_as_image
- # print(inputs.shape)
- # for i in range(inputs.shape[0]):
- # image_i = inputs[i][0]
- # label_i = label[i][0]
- # image_name = "temp/image_{0:}_{1:}.nii.gz".format(it, i)
- # label_name = "temp/label_{0:}_{1:}.nii.gz".format(it, i)
- # save_nd_array_as_image(image_i, image_name, reference_name = None)
- # save_nd_array_as_image(label_i, label_name, reference_name = None)
- # if(it > 10):
- # break
- # return
-
- inputs, label = inputs.to(self.device), label.to(self.device)
-
- # zero the parameter gradients
- self.optimizer.zero_grad()
-
- # forward + backward + optimize
- outputs = self.net(inputs)
- t2 = time.time()
- # for debug
- # if it < 5:
- # outputs = nn.Tanh()(outputs)
- # for i in range(inputs.shape[0]):
- # out_name = "temp/output_{0:}_{1:}.nii.gz".format(it, i)
- # output = outputs[i][0]
- # output = output.cpu().detach().numpy()
- # save_nd_array_as_image(output, out_name, reference_name = None)
- # else:
- # break
-
- loss = self.get_loss_value(data, outputs, label)
- t3 = time.time()
- loss.backward()
- self.optimizer.step()
- t4 = time.time()
- train_loss = train_loss + loss.item()
-
- if(isinstance(outputs, tuple) or isinstance(outputs, list)):
- outputs = outputs[0]
- data_time = data_time + t1 - t0
- gpu_time = gpu_time + t2 - t1
- loss_time = loss_time + t3 - t2
- back_time = back_time + t4 - t3
-
- train_avg_loss = train_loss / iter_valid
- train_scalers = {'loss': train_avg_loss,
- 'data_time': data_time, 'forward_time':gpu_time,
- 'loss_time':loss_time, 'backward_time':back_time}
- return train_scalers
-
- def validation(self):
- class_num = self.config['network']['class_num']
- if(self.inferer is None):
- infer_cfg = self.config['testing']
- infer_cfg['class_num'] = class_num
- self.inferer = Inferer(infer_cfg)
-
- valid_loss_list = []
- validIter = iter(self.valid_loader)
- with torch.no_grad():
- self.net.eval()
-
- # for debug
- # save_num = 0
- for data in validIter:
- inputs = self.convert_tensor_type(data['image'])
- label = self.convert_tensor_type(data['label'])
- inputs, label = inputs.to(self.device), label.to(self.device)
- outputs = self.inferer.run(self.net, inputs)
- # The tensors are on CPU when calculating loss for validation data
- loss = self.get_loss_value(data, outputs, label)
- valid_loss_list.append(loss.item())
-
- # for debug
- # print(inputs.shape, label.shape, outputs.shape)
- # inputs = inputs.cpu().numpy()
- # label = label.cpu().numpy()
- # outputs = outputs.cpu().numpy()
- # for i in range(inputs.shape[0]):
- # image_i = inputs[i][0]
- # label_i = label[i][0]
- # output_i = outputs[i][0]
- # image_name = "temp/case{0:}_image.nii.gz".format(save_num + i)
- # label_name = "temp/case{0:}_label.nii.gz".format(save_num + i)
- # output_name= "temp/case{0:}_output.nii.gz".format(save_num + i)
- # save_nd_array_as_image(image_i, image_name, reference_name = None)
- # save_nd_array_as_image(label_i, label_name, reference_name = None)
- # save_nd_array_as_image(output_i, output_name, reference_name = None)
- # save_num += inputs.shape[0]
- # if(save_num > 20):
- # break
- valid_avg_loss = np.asarray(valid_loss_list).mean()
- valid_scalers = {'loss': valid_avg_loss}
- return valid_scalers
-
- def write_scalars(self, train_scalars, valid_scalars, lr_value, glob_it):
- loss_scalar ={'train':train_scalars['loss'],
- 'valid':valid_scalars['loss']}
- self.summ_writer.add_scalars('loss', loss_scalar, glob_it)
- self.summ_writer.add_scalars('lr', {"lr": lr_value}, glob_it)
- logging.info('train/valid loss {0:.4f}/{1:.4f}'.format(train_scalars['loss'],valid_scalars['loss']))
- logging.info("data: {0:.2f}s, forward: {1:.2f}s, loss: {2:.2f}s, backward: {3:.2f}s".format(
- train_scalars['data_time'], train_scalars['forward_time'],
- train_scalars['loss_time'], train_scalars['backward_time']))
-
- def train_valid(self):
- device_ids = self.config['training']['gpus']
- if(len(device_ids) > 1):
- self.device = torch.device("cuda:0")
- self.net = nn.DataParallel(self.net, device_ids = device_ids)
- else:
- self.device = torch.device("cuda:{0:}".format(device_ids[0]))
- self.net.to(self.device)
-
- ckpt_dir = self.config['training']['ckpt_dir']
- ckpt_prefix = self.config['training'].get('ckpt_prefix', None)
- if(ckpt_prefix is None):
- ckpt_prefix = ckpt_dir.split('/')[-1]
- # iter_start = self.config['training']['iter_start']
- iter_start = 0
- iter_max = self.config['training']['iter_max']
- iter_valid = self.config['training']['iter_valid']
- iter_save = self.config['training'].get('iter_save', None)
- early_stop_it = self.config['training'].get('early_stop_patience', None)
- if(iter_save is None):
- iter_save_list = [iter_max]
- elif(isinstance(iter_save, (tuple, list))):
- iter_save_list = iter_save
- else:
- iter_save_list = range(0, iter_max + 1, iter_save)
-
- self.min_val_loss = 10000.0
- self.max_val_it = 0
- self.best_model_wts = None
- checkpoint = None
- # initialize the network with pre-trained weights
- ckpt_init_name = self.config['training'].get('ckpt_init_name', None)
- ckpt_init_mode = self.config['training'].get('ckpt_init_mode', 0)
- ckpt_for_optm = None
- if(ckpt_init_name is not None):
- checkpoint = torch.load(ckpt_dir + "/" + ckpt_init_name, map_location = self.device)
- pretrained_dict = checkpoint['model_state_dict']
- model_dict = self.net.module.state_dict() if (len(device_ids) > 1) else self.net.state_dict()
- pretrained_dict = {k: v for k, v in pretrained_dict.items() if \
- k in model_dict and tensor_shape_match(pretrained_dict[k], model_dict[k])}
- logging.info("Initializing the following parameters with pre-trained model")
- for k in pretrained_dict:
- logging.info(k)
- if (len(device_ids) > 1):
- self.net.module.load_state_dict(pretrained_dict, strict = False)
- else:
- self.net.load_state_dict(pretrained_dict, strict = False)
- if(ckpt_init_mode > 0): # Load other information
- self.min_val_loss = checkpoint.get('valid_loss', 10000)
- iter_start = checkpoint['iteration']
- self.max_val_it = iter_start
- self.best_model_wts = checkpoint['model_state_dict']
- ckpt_for_optm = checkpoint
-
- self.create_optimizer(self.get_parameters_to_update(), ckpt_for_optm)
- self.create_loss_calculator()
-
- self.trainIter = iter(self.train_loader)
-
- logging.info("{0:} training start".format(str(datetime.now())[:-7]))
- self.summ_writer = SummaryWriter(self.config['training']['ckpt_dir'])
- self.glob_it = iter_start
- for it in range(iter_start, iter_max, iter_valid):
- lr_value = self.optimizer.param_groups[0]['lr']
- t0 = time.time()
- train_scalars = self.training()
- t1 = time.time()
- valid_scalars = self.validation()
- t2 = time.time()
- if(isinstance(self.scheduler, lr_scheduler.ReduceLROnPlateau)):
- self.scheduler.step(-valid_scalars['loss'])
- else:
- self.scheduler.step()
-
- self.glob_it = it + iter_valid
- logging.info("\n{0:} it {1:}".format(str(datetime.now())[:-7], self.glob_it))
- logging.info('learning rate {0:}'.format(lr_value))
- logging.info("training/validation time: {0:.2f}s/{1:.2f}s".format(t1-t0, t2-t1))
- self.write_scalars(train_scalars, valid_scalars, lr_value, self.glob_it)
- if(valid_scalars['loss'] < self.min_val_loss):
- self.min_val_loss = valid_scalars['loss']
- self.max_val_it = self.glob_it
- if(len(device_ids) > 1):
- self.best_model_wts = copy.deepcopy(self.net.module.state_dict())
- else:
- self.best_model_wts = copy.deepcopy(self.net.state_dict())
-
- save_dict = {'iteration': self.max_val_it,
- 'valid_loss': self.min_val_loss,
- 'model_state_dict': self.best_model_wts,
- 'optimizer_state_dict': self.optimizer.state_dict()}
- save_name = "{0:}/{1:}_best.pt".format(ckpt_dir, ckpt_prefix)
- torch.save(save_dict, save_name)
- txt_file = open("{0:}/{1:}_best.txt".format(ckpt_dir, ckpt_prefix), 'wt')
- txt_file.write(str(self.max_val_it))
- txt_file.close()
-
- stop_now = True if(early_stop_it is not None and \
- self.glob_it - self.max_val_it > early_stop_it) else False
- if ((self.glob_it in iter_save_list) or stop_now):
- save_dict = {'iteration': self.glob_it,
- 'valid_loss': valid_scalars['loss'],
- 'model_state_dict': self.net.module.state_dict() \
- if len(device_ids) > 1 else self.net.state_dict(),
- 'optimizer_state_dict': self.optimizer.state_dict()}
- save_name = "{0:}/{1:}_{2:}.pt".format(ckpt_dir, ckpt_prefix, self.glob_it)
- torch.save(save_dict, save_name)
- txt_file = open("{0:}/{1:}_latest.txt".format(ckpt_dir, ckpt_prefix), 'wt')
- txt_file.write(str(self.glob_it))
- txt_file.close()
- if(stop_now):
- logging.info("The training is early stopped")
- break
- # save the best performing checkpoint
- logging.info('The best performing iter is {0:}, valid loss {1:}'.format(\
- self.max_val_it, self.min_val_loss))
- self.summ_writer.close()
-
- def save_outputs(self, data):
- """
- Save prediction output.
-
- :param data: (dictionary) A data dictionary with prediciton result and other
- information such as input image name.
- """
- output_dir = self.config['testing']['output_dir']
- ignore_dir = self.config['testing'].get('filename_ignore_dir', True)
- filename_replace_source = self.config['testing'].get('filename_replace_source', None)
- filename_replace_target = self.config['testing'].get('filename_replace_target', None)
- if(not os.path.exists(output_dir)):
- os.makedirs(output_dir, exist_ok=True)
-
- names, pred = data['names'], data['predict']
- if(isinstance(pred, (list, tuple))):
- pred = pred[0]
- pred = np.tanh(pred)
- if(self.postprocessor is not None):
- pred = self.postprocessor(pred)
- # pred = scipy.special.expit(pred)
- # save the output predictions
- test_dir = self.config['dataset'].get('test_dir', None)
- if(test_dir is None):
- test_dir = self.config['dataset']['train_dir']
-
- for i in range(pred.shape[1]):
- save_name = names[i][0].split('/')[-1] if ignore_dir else \
- names[i][0].replace('/', '_')
- if((filename_replace_source is not None) and (filename_replace_target is not None)):
- save_name = save_name.replace(filename_replace_source, filename_replace_target)
- print(save_name)
- save_name = "{0:}/{1:}".format(output_dir, save_name)
- save_nd_array_as_image(pred[i][0], save_name, test_dir + '/' + names[i][0])
-
-
\ No newline at end of file
diff --git a/pymic/net_run/agent_seg.py b/pymic/net_run/agent_seg.py
deleted file mode 100644
index 654b7d7..0000000
--- a/pymic/net_run/agent_seg.py
+++ /dev/null
@@ -1,641 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-import copy
-import os
-import time
-import logging
-import scipy
-import torch
-import torchvision.transforms as transforms
-import numpy as np
-import torch.nn as nn
-import torch.optim as optim
-import torch.nn.functional as F
-from datetime import datetime
-from random import random
-from torch.optim import lr_scheduler
-from tensorboardX import SummaryWriter
-from pymic.io.image_read_write import save_nd_array_as_image
-from pymic.io.nifty_dataset import NiftyDataset
-from pymic.net.net_dict_seg import SegNetDict
-from pymic.net.multi_net import MultiNet
-from pymic.net_run.agent_abstract import NetRunAgent
-from pymic.net_run.infer_func import Inferer
-from pymic.loss.loss_dict_seg import SegLossDict
-from pymic.loss.seg.combined import CombinedLoss
-from pymic.loss.seg.deep_sup import DeepSuperviseLoss
-from pymic.loss.seg.util import get_soft_label
-from pymic.loss.seg.util import reshape_prediction_and_ground_truth
-from pymic.loss.seg.util import get_classwise_dice
-from pymic.transform.trans_dict import TransformDict
-from pymic.util.post_process import PostProcessDict
-from pymic.util.image_process import convert_label
-from pymic.util.general import mixup, tensor_shape_match
-
-class SegmentationAgent(NetRunAgent):
- def __init__(self, config, stage = 'train'):
- super(SegmentationAgent, self).__init__(config, stage)
- self.transform_dict = TransformDict
- self.net_dict = SegNetDict
- self.postprocess_dict = PostProcessDict
- self.postprocessor = None
-
- def get_transform_names_and_parameters(self, stage):
- """
- Get a list of transform objects for creating a dataset
- """
- assert(stage in ['train', 'valid', 'test'])
- transform_key = stage + '_transform'
- trans_names = self.config['dataset'][transform_key]
- trans_params = self.config['dataset']
- trans_params['task'] = self.task_type
- return trans_names, trans_params
-
- def get_data_transform_list(self, trans_names, trans_params):
- transform_list = []
- if(trans_names is not None and len(trans_names) > 0):
- for name in trans_names:
- if(name not in self.transform_dict):
- raise(ValueError("Undefined transform {0:}".format(name)))
- one_transform = self.transform_dict[name](trans_params)
- transform_list.append(one_transform)
- return transform_list
-
- def get_stage_dataset_from_config(self, stage):
- trans_names, trans_params = self.get_transform_names_and_parameters(stage)
- transform_list = self.get_data_transform_list(trans_names, trans_params)
- data_transform = transforms.Compose(transform_list)
-
- csv_file = self.config['dataset'].get(stage + '_csv', None)
- if(stage == 'test'):
- with_label = False
- self.test_transforms = transform_list
- else:
- with_label = self.config['dataset'].get(stage + '_label', True)
- modal_num = self.config['dataset'].get('modal_num', 1)
- allow_miss = self.config['dataset'].get('allow_missing_modal', False)
- stage_dir = self.config['dataset'].get('train_dir', None)
- stage_dim = self.config['dataset'].get('train_dim', 3)
- stage_lab_key = self.config['dataset'].get('train_label_key', 'label')
- if(stage == 'valid'): # and "valid_dir" in self.config['dataset']):
- stage_dir = self.config['dataset'].get('valid_dir', stage_dir)
- stage_dim = self.config['dataset'].get('valid_dim', stage_dim)
- stage_lab_key = self.config['dataset'].get('valid_label_key', 'label')
- if(stage == 'test'): # and "test_dir" in self.config['dataset']):
- stage_dir = self.config['dataset'].get('test_dir', stage_dir)
- stage_dim = self.config['dataset'].get('test_dim', stage_dim)
- stage_lab_key = self.config['dataset'].get('test_label_key', 'label')
- logging.info("Creating dataset for {0:}".format(stage))
- dataset = NiftyDataset(root_dir = stage_dir,
- csv_file = csv_file,
- modal_num = modal_num,
- image_dim = stage_dim,
- allow_missing_modal = allow_miss,
- label_key = stage_lab_key,
- transform = data_transform,
- task = self.task_type)
- return dataset
-
- def create_network(self):
- if(self.net is None):
- net_name = self.config['network']['net_type']
- if(isinstance(net_name, (tuple, list))):
- self.net = MultiNet(self.net_dict, self.config['network'])
- else:
- if(net_name not in self.net_dict):
- raise ValueError("Undefined network {0:}".format(net_name))
- self.net = self.net_dict[net_name](self.config['network'])
- if(self.tensor_type == 'float'):
- self.net.float()
- else:
- self.net.double()
- if(hasattr(self.net, "set_stage")):
- self.net.set_stage(self.stage)
- param_number = sum(p.numel() for p in self.net.parameters() if p.requires_grad)
- logging.info('parameter number {0:}'.format(param_number))
-
- def get_parameters_to_update(self):
- if hasattr(self.net, "get_parameters_to_update"):
- params = self.net.get_parameters_to_update()
- else:
- params = self.net.parameters()
- return params
-
-
- def create_loss_calculator(self):
- if(self.loss_dict is None):
- self.loss_dict = SegLossDict
- loss_name = self.config['training']['loss_type']
- if isinstance(loss_name, (list, tuple)):
- base_loss = CombinedLoss(self.config['training'], self.loss_dict)
- elif (loss_name not in self.loss_dict):
- raise ValueError("Undefined loss function {0:}".format(loss_name))
- else:
- base_loss = self.loss_dict[loss_name](self.config['training'])
- if(self.config['training'].get('deep_supervise', False)):
- weight = self.config['training'].get('deep_supervise_weight', None)
- mode = self.config['training'].get('deep_supervise_mode', 2)
- params = {'deep_supervise_weight': weight,
- 'deep_supervise_mode': mode,
- 'base_loss':base_loss}
- self.loss_calculator = DeepSuperviseLoss(params)
- else:
- self.loss_calculator = base_loss
-
- def get_loss_value(self, data, pred, gt, param = None):
- loss_input_dict = {'prediction':pred, 'ground_truth': gt}
- if(isinstance(pred, tuple) or isinstance(pred, list)):
- device = pred[0].device
- else:
- device = pred.device
- pixel_weight = data.get('pixel_weight', None)
- if(pixel_weight is not None):
- loss_input_dict['pixel_weight'] = pixel_weight.to(device)
-
- class_weight = self.config['training'].get('class_weight', None)
- if(class_weight is not None):
- class_num = self.config['network']['class_num']
- assert(len(class_weight) == class_num)
- class_weight = torch.from_numpy(np.asarray(class_weight))
- class_weight = self.convert_tensor_type(class_weight)
- loss_input_dict['class_weight'] = class_weight.to(device)
- loss_value = self.loss_calculator(loss_input_dict)
- return loss_value
-
- def training(self):
- class_num = self.config['network']['class_num']
- iter_valid = self.config['training']['iter_valid']
- mixup_prob = self.config['training'].get('mixup_probability', 0.0)
- train_loss = 0
- train_dice_list = []
- data_time, gpu_time, loss_time, back_time = 0, 0, 0, 0
- self.net.train()
- for it in range(iter_valid):
- t0 = time.time()
- try:
- data = next(self.trainIter)
- except StopIteration:
- self.trainIter = iter(self.train_loader)
- data = next(self.trainIter)
- t1 = time.time()
- inputs = self.convert_tensor_type(data['image'])
- labels_prob = self.convert_tensor_type(data['label_prob'])
- if(mixup_prob > 0 and random() < mixup_prob):
- inputs, labels_prob = mixup(inputs, labels_prob)
-
- # for debug
- # print("current iteration", it)
- # if(it > 10):
- # break
- # for i in range(inputs.shape[0]):
- # image_i = inputs[i][0]
- # # label_i = labels_prob[i][1]
- # label_i = np.argmax(labels_prob[i], axis = 0)
- # # pixw_i = pix_w[i][0]
- # print(image_i.shape, label_i.shape)
- # image_name = "temp/image_{0:}_{1:}.nii.gz".format(it, i)
- # label_name = "temp/label_{0:}_{1:}.nii.gz".format(it, i)
- # # weight_name= "temp/weight_{0:}_{1:}.nii.gz".format(it, i)
- # save_nd_array_as_image(image_i, image_name, reference_name = None)
- # save_nd_array_as_image(label_i, label_name, reference_name = None)
- # # save_nd_array_as_image(pixw_i, weight_name, reference_name = None)
- # continue
-
-
- inputs, labels_prob = inputs.to(self.device), labels_prob.to(self.device)
-
- # zero the parameter gradients
- self.optimizer.zero_grad()
-
- # forward + backward + optimize
- outputs = self.net(inputs)
- t2 = time.time()
- loss = self.get_loss_value(data, outputs, labels_prob)
- t3 = time.time()
- loss.backward()
- t4 = time.time()
- self.optimizer.step()
- train_loss = train_loss + loss.item()
- # get dice evaluation for each class
- if(isinstance(outputs, tuple) or isinstance(outputs, list)):
- outputs = outputs[0]
- outputs_argmax = torch.argmax(outputs, dim = 1, keepdim = True)
- soft_out = get_soft_label(outputs_argmax, class_num, self.tensor_type)
- soft_out, labels_prob = reshape_prediction_and_ground_truth(soft_out, labels_prob)
- dice_list = get_classwise_dice(soft_out, labels_prob)
- train_dice_list.append(dice_list.cpu().numpy())
-
- data_time = data_time + t1 - t0
- gpu_time = gpu_time + t2 - t1
- loss_time = loss_time + t3 - t2
- back_time = back_time + t4 - t3
- train_avg_loss = train_loss / iter_valid
- train_cls_dice = np.asarray(train_dice_list).mean(axis = 0)
- train_avg_dice = train_cls_dice[1:].mean()
-
- train_scalers = {'loss': train_avg_loss, 'avg_fg_dice':train_avg_dice,\
- 'class_dice': train_cls_dice,
- 'data_time': data_time, 'forward_time':gpu_time,
- 'loss_time':loss_time, 'backward_time':back_time}
- return train_scalers
-
- def validation(self):
- if(self.valid_loader is None):
- return None
- class_num = self.config['network']['class_num']
- if(self.inferer is None):
- infer_cfg = {}
- infer_cfg['class_num'] = class_num
- infer_cfg['sliding_window_enable'] = self.config['testing'].get('sliding_window_enable', False)
- if(infer_cfg['sliding_window_enable']):
- patch_size = self.config['dataset'].get('patch_size', None)
- if(patch_size is None):
- patch_size = self.config['testing']['sliding_window_size']
- infer_cfg['sliding_window_size'] = patch_size
- infer_cfg['sliding_window_stride'] = [i//2 for i in patch_size]
- self.inferer = Inferer(infer_cfg)
-
- valid_loss_list = []
- valid_dice_list = []
- validIter = iter(self.valid_loader)
- with torch.no_grad():
- self.net.eval()
- for data in validIter:
- inputs = self.convert_tensor_type(data['image'])
- if('label_prob' not in data):
- raise ValueError("label_prob is not found in validation data, make sure" +
- "that LabelToProbability is used in valid_transform.")
- labels_prob = self.convert_tensor_type(data['label_prob'])
- inputs, labels_prob = inputs.to(self.device), labels_prob.to(self.device)
- batch_n = inputs.shape[0]
- outputs = self.inferer.run(self.net, inputs)
-
- # The tensors are on CPU when calculating loss for validation data
- loss = self.get_loss_value(data, outputs, labels_prob)
- valid_loss_list.append(loss.item())
-
- if(isinstance(outputs, tuple) or isinstance(outputs, list)):
- outputs = outputs[0]
- outputs_argmax = torch.argmax(outputs, dim = 1, keepdim = True)
- soft_out = get_soft_label(outputs_argmax, class_num, self.tensor_type)
- for i in range(batch_n):
- soft_out_i, labels_prob_i = reshape_prediction_and_ground_truth(\
- soft_out[i:i+1], labels_prob[i:i+1])
- temp_dice = get_classwise_dice(soft_out_i, labels_prob_i)
- valid_dice_list.append(temp_dice.cpu().numpy())
-
- valid_avg_loss = np.asarray(valid_loss_list).mean()
- valid_cls_dice = np.asarray(valid_dice_list).mean(axis = 0)
- valid_avg_dice = valid_cls_dice[1:].mean()
- valid_scalers = {'loss': valid_avg_loss, 'avg_fg_dice': valid_avg_dice,\
- 'class_dice': valid_cls_dice}
- return valid_scalers
-
- def write_scalars(self, train_scalars, valid_scalars, lr_value, glob_it):
- loss_scalar ={'train':train_scalars['loss']}
- dice_scalar ={'train':train_scalars['avg_fg_dice']}
- if(valid_scalars is not None):
- loss_scalar['valid'] = valid_scalars['loss']
- dice_scalar['valid'] = valid_scalars['avg_fg_dice']
- self.summ_writer.add_scalars('loss', loss_scalar, glob_it)
- self.summ_writer.add_scalars('dice', dice_scalar, glob_it)
- self.summ_writer.add_scalars('lr', {"lr": lr_value}, glob_it)
- class_num = self.config['network']['class_num']
- for c in range(class_num):
- cls_dice_scalar = {'train':train_scalars['class_dice'][c]}
- if(valid_scalars is not None):
- cls_dice_scalar['valid'] = valid_scalars['class_dice'][c]
- self.summ_writer.add_scalars('class_{0:}_dice'.format(c), cls_dice_scalar, glob_it)
-
- logging.info('train loss {0:.4f}, avg foreground dice {1:.4f} '.format(
- train_scalars['loss'], train_scalars['avg_fg_dice']) + "[" + \
- ' '.join("{0:.4f}".format(x) for x in train_scalars['class_dice']) + "]")
- if(valid_scalars is not None):
- logging.info('valid loss {0:.4f}, avg foreground dice {1:.4f} '.format(
- valid_scalars['loss'], valid_scalars['avg_fg_dice']) + "[" + \
- ' '.join("{0:.4f}".format(x) for x in valid_scalars['class_dice']) + "]")
- logging.info("data: {0:.2f}s, forward: {1:.2f}s, loss: {2:.2f}s, backward: {3:.2f}s".format(
- train_scalars['data_time'], train_scalars['forward_time'],
- train_scalars['loss_time'], train_scalars['backward_time']))
-
- def load_pretrained_weights(self, network, pretrained_dict, device_ids):
- if(len(device_ids) > 1):
- if(hasattr(network.module, "get_parameters_to_load")):
- model_dict = network.module.get_parameters_to_load()
- else:
- model_dict = network.module.state_dict()
- else:
- if(hasattr(network, "get_parameters_to_load")):
- model_dict = network.get_parameters_to_load()
- else:
- model_dict = network.state_dict()
- pretrained_dict = {k: v for k, v in pretrained_dict.items() if \
- k in model_dict and tensor_shape_match(pretrained_dict[k], model_dict[k])}
- logging.info("Initializing the following parameters with pre-trained model")
- for k in pretrained_dict:
- logging.info(k)
- if (len(device_ids) > 1):
- network.module.load_state_dict(pretrained_dict, strict = False)
- else:
- network.load_state_dict(pretrained_dict, strict = False)
-
- def train_valid(self):
- device_ids = self.config['training']['gpus']
- if(len(device_ids) > 1):
- self.device = torch.device("cuda:0")
- self.net = nn.DataParallel(self.net, device_ids = device_ids)
- else:
- self.device = torch.device("cuda:{0:}".format(device_ids[0]))
- self.net.to(self.device)
-
- ckpt_dir = self.config['training']['ckpt_dir']
- if(ckpt_dir[-1] == "/"):
- ckpt_dir = ckpt_dir[:-1]
- ckpt_prefix = self.config['training'].get('ckpt_prefix', None)
- if(ckpt_prefix is None):
- ckpt_prefix = ckpt_dir.split('/')[-1]
- # iter_start = self.config['training']['iter_start']
- iter_start = 0
- iter_max = self.config['training']['iter_max']
- iter_valid = self.config['training']['iter_valid']
- iter_save = self.config['training'].get('iter_save', None)
- early_stop_it = self.config['training'].get('early_stop_patience', None)
- if(iter_save is None):
- iter_save_list = [iter_max]
- elif(isinstance(iter_save, (tuple, list))):
- iter_save_list = iter_save
- else:
- iter_save_list = range(0, iter_max + 1, iter_save)
-
- self.max_val_dice = 0.0
- self.max_val_it = 0
- self.best_model_wts = None
- checkpoint = None
- # initialize the network with pre-trained weights
- ckpt_init_name = self.config['training'].get('ckpt_init_name', None)
- ckpt_init_mode = self.config['training'].get('ckpt_init_mode', 0)
- ckpt_for_optm = None
- if(ckpt_init_name is not None):
- checkpoint = torch.load(ckpt_dir + "/" + ckpt_init_name, map_location = self.device)
- pretrained_dict = checkpoint['model_state_dict']
- self.load_pretrained_weights(self.net, pretrained_dict, device_ids)
-
- if(ckpt_init_mode > 0): # Load other information
- self.max_val_dice = checkpoint.get('valid_pred', 0)
- iter_start = checkpoint['iteration']
- self.max_val_it = iter_start
- self.best_model_wts = checkpoint['model_state_dict']
- ckpt_for_optm = checkpoint
- self.create_optimizer(self.get_parameters_to_update(), ckpt_for_optm)
- self.create_loss_calculator()
-
- self.trainIter = iter(self.train_loader)
-
- logging.info("{0:} training start".format(str(datetime.now())[:-7]))
- self.summ_writer = SummaryWriter(self.config['training']['ckpt_dir'])
- self.glob_it = iter_start
- for it in range(iter_start, iter_max, iter_valid):
- lr_value = self.optimizer.param_groups[0]['lr']
- t0 = time.time()
- train_scalars = self.training()
- t1 = time.time()
- valid_scalars = self.validation()
- t2 = time.time()
- if(isinstance(self.scheduler, lr_scheduler.ReduceLROnPlateau)):
- self.scheduler.step(valid_scalars['avg_fg_dice'])
- else:
- self.scheduler.step()
-
- self.glob_it = it + iter_valid
- logging.info("\n{0:} it {1:}".format(str(datetime.now())[:-7], self.glob_it))
- logging.info('learning rate {0:}'.format(lr_value))
- logging.info("training/validation time: {0:.2f}s/{1:.2f}s".format(t1-t0, t2-t1))
- self.write_scalars(train_scalars, valid_scalars, lr_value, self.glob_it)
-
- if(valid_scalars is not None):
- if(valid_scalars['avg_fg_dice'] > self.max_val_dice):
- self.max_val_dice = valid_scalars['avg_fg_dice']
- self.max_val_it = self.glob_it
- if(len(device_ids) > 1):
- self.best_model_wts = copy.deepcopy(self.net.module.state_dict())
- else:
- self.best_model_wts = copy.deepcopy(self.net.state_dict())
- save_dict = {'iteration': self.max_val_it,
- 'valid_pred': self.max_val_dice,
- 'model_state_dict': self.best_model_wts,
- 'optimizer_state_dict': self.optimizer.state_dict()}
- save_name = "{0:}/{1:}_best.pt".format(ckpt_dir, ckpt_prefix)
- torch.save(save_dict, save_name)
- txt_file = open("{0:}/{1:}_best.txt".format(ckpt_dir, ckpt_prefix), 'wt')
- txt_file.write(str(self.max_val_it))
- txt_file.close()
- else:
- self.max_val_it = self.glob_it
-
- stop_now = True if (early_stop_it is not None and \
- self.glob_it - self.max_val_it > early_stop_it) else False
- if ((self.glob_it in iter_save_list) or stop_now):
- save_dict = {'iteration': self.glob_it,
- 'model_state_dict': self.net.module.state_dict() \
- if len(device_ids) > 1 else self.net.state_dict(),
- 'optimizer_state_dict': self.optimizer.state_dict()}
- if(valid_scalars is not None):
- save_dict['valid_pred'] = valid_scalars['avg_fg_dice']
- save_name = "{0:}/{1:}_{2:}.pt".format(ckpt_dir, ckpt_prefix, self.glob_it)
- torch.save(save_dict, save_name)
- txt_file = open("{0:}/{1:}_latest.txt".format(ckpt_dir, ckpt_prefix), 'wt')
- txt_file.write(str(self.glob_it))
- txt_file.close()
- if(stop_now):
- logging.info("The training is early stopped")
- break
- # save the best performing checkpoint
- if(valid_scalars is not None):
- logging.info('The best performing iter is {0:}, valid dice {1:}'.format(\
- self.max_val_it, self.max_val_dice))
- self.summ_writer.close()
-
- def infer(self):
- device_ids = self.config['testing']['gpus']
- device = torch.device("cuda:{0:}".format(device_ids[0]))
- self.net.to(device)
-
- if(self.config['testing'].get('evaluation_mode', True)):
- self.net.eval()
- if(self.config['testing'].get('test_time_dropout', False)):
- def test_time_dropout(m):
- if(type(m) == nn.Dropout):
- logging.info('dropout layer')
- m.train()
- self.net.apply(test_time_dropout)
-
- ckpt_mode = self.config['testing']['ckpt_mode']
- ckpt_name = self.get_checkpoint_name()
- if(ckpt_mode == 3):
- assert(isinstance(ckpt_name, (tuple, list)))
- self.infer_with_multiple_checkpoints()
- return
- else:
- if(isinstance(ckpt_name, (tuple, list))):
- raise ValueError("ckpt_mode should be 3 if ckpt_name is a list")
-
- # load network parameters and set the network as evaluation mode
- print("ckpt name", ckpt_name)
- checkpoint = torch.load(ckpt_name, map_location = device, weights_only = False)
- self.net.load_state_dict(checkpoint['model_state_dict'])
-
- if(self.inferer is None):
- infer_cfg = self.config['testing']
- infer_cfg['class_num'] = self.config['network']['class_num']
- self.inferer = Inferer(infer_cfg)
- postpro_name = self.config['testing'].get('post_process', None)
- if(self.postprocessor is None and postpro_name is not None):
- self.postprocessor = self.postprocess_dict[postpro_name](self.config['testing'])
- infer_time_list = []
- with torch.no_grad():
- for data in self.test_loader:
- images = self.convert_tensor_type(data['image'])
- images = images.to(device)
-
- # for debug
- # for i in range(images.shape[0]):
- # image_i = images[i][0]
- # label_i = images[i][0]
- # image_name = "temp/{0:}_image.nii.gz".format(names[0])
- # label_name = "temp/{0:}_label.nii.gz".format(names[0])
- # save_nd_array_as_image(image_i, image_name, reference_name = None)
- # save_nd_array_as_image(label_i, label_name, reference_name = None)
- # continue
- start_time = time.time()
-
- pred = self.inferer.run(self.net, images)
- # convert tensor to numpy
- if(isinstance(pred, (tuple, list))):
- pred = [item.cpu().numpy() for item in pred]
- else:
- pred = pred.cpu().numpy()
- data['predict'] = pred
- # inverse transform
- for transform in self.test_transforms[::-1]:
- if (transform.inverse):
- data = transform.inverse_transform_for_prediction(data)
-
- infer_time = time.time() - start_time
- infer_time_list.append(infer_time)
- self.save_outputs(data)
- infer_time_list = np.asarray(infer_time_list)
- time_avg, time_std = infer_time_list.mean(), infer_time_list.std()
- logging.info("testing time {0:} +/- {1:}".format(time_avg, time_std))
-
- def infer_with_multiple_checkpoints(self):
- """
- Inference with ensemble of multilple check points.
- """
- device_ids = self.config['testing']['gpus']
- device = torch.device("cuda:{0:}".format(device_ids[0]))
-
- if(self.inferer is None):
- infer_cfg = self.config['testing']
- infer_cfg['class_num'] = self.config['network']['class_num']
- self.inferer = Inferer(infer_cfg)
- ckpt_names = self.config['testing']['ckpt_name']
- infer_time_list = []
- with torch.no_grad():
- for data in self.test_loader:
- images = self.convert_tensor_type(data['image'])
- images = images.to(device)
-
- # for debug
- # for i in range(images.shape[0]):
- # image_i = images[i][0]
- # label_i = images[i][0]
- # image_name = "temp/{0:}_image.nii.gz".format(names[0])
- # label_name = "temp/{0:}_label.nii.gz".format(names[0])
- # save_nd_array_as_image(image_i, image_name, reference_name = None)
- # save_nd_array_as_image(label_i, label_name, reference_name = None)
- # continue
- start_time = time.time()
- predict_list = []
- for ckpt_name in ckpt_names:
- checkpoint = torch.load(ckpt_name, map_location = device)
- self.net.load_state_dict(checkpoint['model_state_dict'])
-
- pred = self.inferer.run(self.net, images)
- # convert tensor to numpy
- if(isinstance(pred, (tuple, list))):
- pred = [item.cpu().numpy() for item in pred]
- else:
- pred = pred.cpu().numpy()
- predict_list.append(pred)
- pred = np.mean(predict_list, axis=0)
- data['predict'] = pred
- # inverse transform
- for transform in self.test_transforms[::-1]:
- if (transform.inverse):
- data = transform.inverse_transform_for_prediction(data)
-
- infer_time = time.time() - start_time
- infer_time_list.append(infer_time)
- self.save_outputs(data)
- infer_time_list = np.asarray(infer_time_list)
- time_avg, time_std = infer_time_list.mean(), infer_time_list.std()
- logging.info("testing time {0:} +/- {1:}".format(time_avg, time_std))
-
- def save_outputs(self, data):
- """
- Save prediction output.
-
- :param data: (dictionary) A data dictionary with prediciton result and other
- information such as input image name.
- """
- output_dir = self.config['testing']['output_dir']
- ignore_dir = self.config['testing'].get('filename_ignore_dir', True)
- save_prob = self.config['testing'].get('save_probability', False)
- label_source = self.config['testing'].get('label_source', None)
- label_target = self.config['testing'].get('label_target', None)
- filename_replace_source = self.config['testing'].get('filename_replace_source', None)
- filename_replace_target = self.config['testing'].get('filename_replace_target', None)
- if(not os.path.exists(output_dir)):
- os.makedirs(output_dir, exist_ok=True)
-
- names, pred = data['names'], data['predict']
- if(isinstance(pred, (list, tuple))):
- pred = pred[0]
- prob = scipy.special.softmax(pred, axis = 1)
- output = np.asarray(np.argmax(prob, axis = 1), np.uint8)
- if((label_source is not None) and (label_target is not None)):
- output = convert_label(output, label_source, label_target)
- if(self.postprocessor is not None):
- for i in range(output.shape[0]):
- output[i] = self.postprocessor(output[i])
- # save the output and (optionally) probability predictions
- test_dir = self.config['dataset'].get('test_dir', None)
- if(test_dir is None):
- test_dir = self.config['dataset']['train_dir']
-
- for i in range(output.shape[0]):
- save_name = names[i][0].split('/')[-1] if ignore_dir else \
- names[i][0].replace('/', '_')
- if((filename_replace_source is not None) and (filename_replace_target is not None)):
- save_name = save_name.replace(filename_replace_source, filename_replace_target)
- print(save_name)
- save_name = "{0:}/{1:}".format(output_dir, save_name)
- save_nd_array_as_image(output[i], save_name, test_dir + '/' + names[i][0])
- save_name_split = save_name.split('.')
-
- if(not save_prob):
- continue
- if('.nii.gz' in save_name):
- save_prefix = '.'.join(save_name_split[:-2])
- save_format = 'nii.gz'
- else:
- save_prefix = '.'.join(save_name_split[:-1])
- save_format = save_name_split[-1]
-
- class_num = prob.shape[1]
- for c in range(0, class_num):
- temp_prob = prob[i][c]
- prob_save_name = "{0:}_prob_{1:}.{2:}".format(save_prefix, c, save_format)
- if(len(temp_prob.shape) == 2):
- temp_prob = np.asarray(temp_prob * 255, np.uint8)
- save_nd_array_as_image(temp_prob, prob_save_name, test_dir + '/' + names[i][0])
diff --git a/pymic/net_run/get_optimizer.py b/pymic/net_run/get_optimizer.py
deleted file mode 100644
index 771b448..0000000
--- a/pymic/net_run/get_optimizer.py
+++ /dev/null
@@ -1,79 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-
-import torch
-from torch import optim
-from torch.optim import lr_scheduler
-from pymic.util.general import keyword_match
-
-def get_optimizer(name, net_params, optim_params):
- lr = optim_params['learning_rate']
- momentum = optim_params['momentum']
- weight_decay = optim_params['weight_decay']
- # see https://www.codeleading.com/article/44815584159/
- param_group = [{'params': net_params, 'initial_lr': lr}]
- if(keyword_match(name, "SGD")):
- nesterov = optim_params.get('nesterov', True)
- return optim.SGD(param_group, lr,
- momentum = momentum, weight_decay = weight_decay, nesterov = nesterov)
- elif(keyword_match(name, "Adam")):
- return optim.Adam(param_group, lr, weight_decay = weight_decay)
- elif(keyword_match(name, "SparseAdam")):
- return optim.SparseAdam(param_group, lr)
- elif(keyword_match(name, "Adadelta")):
- return optim.Adadelta(param_group, lr, weight_decay = weight_decay)
- elif(keyword_match(name, "Adagrad")):
- return optim.Adagrad(param_group, lr, weight_decay = weight_decay)
- elif(keyword_match(name, "Adamax")):
- return optim.Adamax(param_group, lr, weight_decay = weight_decay)
- elif(keyword_match(name, "ASGD")):
- return optim.ASGD(param_group, lr, weight_decay = weight_decay)
- elif(keyword_match(name, "LBFGS")):
- return optim.LBFGS(param_group, lr)
- elif(keyword_match(name, "RMSprop")):
- return optim.RMSprop(param_group, lr, momentum = momentum,
- weight_decay = weight_decay)
- elif(keyword_match(name, "Rprop")):
- return optim.Rprop(param_group, lr)
- else:
- raise ValueError("unsupported optimizer {0:}".format(name))
-
-
-def get_lr_scheduler(optimizer, sched_params):
- name = sched_params["lr_scheduler"]
- val_it = sched_params["iter_valid"]
- epoch_last = sched_params["last_iter"]
- if(epoch_last > 0):
- epoch_last = int(epoch_last / val_it)
- if(name is None):
- return None
- if(keyword_match(name, "ReduceLROnPlateau")):
- patience_it = sched_params["ReduceLROnPlateau_patience".lower()]
- patience = patience_it / val_it
- lr_gamma = sched_params["lr_gamma"]
- scheduler = lr_scheduler.ReduceLROnPlateau(optimizer,
- mode = "max", factor=lr_gamma, patience = patience)
- elif(keyword_match(name, "MultiStepLR")):
- lr_milestones = sched_params["lr_milestones"]
- lr_milestones = [int(item / val_it) for item in lr_milestones]
- lr_gamma = sched_params["lr_gamma"]
- scheduler = lr_scheduler.MultiStepLR(optimizer,
- lr_milestones, lr_gamma, epoch_last)
- elif(keyword_match(name, "StepLR")):
- lr_step = sched_params["lr_step"] / val_it
- lr_gamma = sched_params["lr_gamma"]
- scheduler = lr_scheduler.StepLR(optimizer,
- lr_step, lr_gamma, epoch_last)
- elif(keyword_match(name, "CosineAnnealingLR")):
- epoch_max = sched_params["iter_max"] / val_it
- lr_min = sched_params.get("lr_min", 0)
- scheduler = lr_scheduler.CosineAnnealingLR(optimizer,
- epoch_max, lr_min, epoch_last)
- elif(keyword_match(name, "PolynomialLR")):
- epoch_max = sched_params["iter_max"] / val_it
- power = sched_params["lr_power"]
- scheduler = lr_scheduler.PolynomialLR(optimizer,
- epoch_max, power, epoch_last)
- else:
- raise ValueError("unsupported lr scheduler {0:}".format(name))
- return scheduler
\ No newline at end of file
diff --git a/pymic/net_run/infer_func.py b/pymic/net_run/infer_func.py
deleted file mode 100644
index e0e466e..0000000
--- a/pymic/net_run/infer_func.py
+++ /dev/null
@@ -1,231 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-
-import torch
-import numpy as np
-from scipy.ndimage.filters import gaussian_filter
-from torch.nn.functional import interpolate
-
-class Inferer(object):
- """
- The class for inference.
- The arguments should be written in the `config` dictionary,
- and it has the following fields:
-
- :param `sliding_window_enable`: (optional, bool) Default is `False`.
- :param `sliding_window_size`: (optional, list) The sliding window size.
- :param `sliding_window_stride`: (optional, list) The sliding window stride.
- :param `tta_mode`: (optional, int) The test time augmentation mode. Default
- is 0 (no test time augmentation). The other option is 1 (augmentation
- with horinzontal and vertical flipping) and 2 (ensemble of inference
- in axial, sagittal and coronal views for 2D networks applied to 3D volumes)
- """
- def __init__(self, config):
- self.config = config
-
- def __infer(self, image):
- use_sw = self.config.get('sliding_window_enable', False)
- if(not use_sw):
- outputs = self.model(image)
- else:
- outputs = self.__infer_with_sliding_window(image)
- return outputs
-
- def __get_prediction_number_and_scales(self, tempx):
- """
- If the network outputs multiple tensors with different sizes, return the
- number of tensors and the scale of each tensor compared with the first one
- """
- img_dim = len(tempx.shape) - 2
- output = self.model(tempx)
- if(isinstance(output, (tuple, list))):
- output_num = len(output)
- scales = [[1.0] * img_dim]
- shape0 = list(output[0].shape[2:])
- for i in range(1, output_num):
- shapei= list(output[i].shape[2:])
- scale = [(shapei[d] + 0.0) / shape0[d] for d in range(img_dim)]
- scales.append(scale)
- else:
- output_num, scales = 1, None
- return output_num, scales
-
- def __get_gaussian_weight_map(self, window_size, sigma_scale = 1.0/8):
- w = np.zeros(window_size)
- center = [i//2 for i in window_size]
- sigmas = [i*sigma_scale for i in window_size]
- w[tuple(center)] = 1.0
- w = gaussian_filter(w, sigmas, 0, mode='constant', cval=0)
- return w
-
- def __infer_with_sliding_window(self, image):
- """
- Use sliding window to predict segmentation for large images. The outupt of each
- sliding window is weighted by a Gaussian map that hihglights contributions of windows
- with a centroid closer to a given pixel.
- Note that the network may output a list of tensors with difference sizes for multi-scale prediction.
- """
- window_size = [x for x in self.config['sliding_window_size']]
- window_stride = [x for x in self.config['sliding_window_stride']]
- window_batch = self.config.get('sliding_window_batch', 1)
- class_num = self.config['class_num']
- img_full_shape = list(image.shape)
- batch_size = img_full_shape[0]
- assert(batch_size == 1 or window_batch == 1)
- img_chns = img_full_shape[1]
- img_shape = img_full_shape[2:]
- img_dim = len(img_shape)
- if(img_dim != 2 and img_dim !=3):
- raise ValueError("Inference using sliding window only supports 2D and 3D images")
-
- for d in range(img_dim):
- if (window_size[d] is None) or window_size[d] > img_shape[d]:
- window_size[d] = img_shape[d]
- if (window_stride[d] is None) or window_stride[d] > window_size[d]:
- window_stride[d] = window_size[d]
-
- if all([window_size[d] >= img_shape[d] for d in range(img_dim)]):
- output = self.model(image)
- return output
-
- crop_start_list = []
- for w in range(0, img_shape[-1], window_stride[-1]):
- w_min = min(w, img_shape[-1] - window_size[-1])
- for h in range(0, img_shape[-2], window_stride[-2]):
- h_min = min(h, img_shape[-2] - window_size[-2])
- if(img_dim == 2):
- crop_start_list.append([h_min, w_min])
- else:
- for d in range(0, img_shape[0], window_stride[0]):
- d_min = min(d, img_shape[0] - window_size[0])
- crop_start_list.append([d_min, h_min, w_min])
-
- output_shape = [batch_size, class_num] + img_shape
- weight = torch.zeros(output_shape).to(image.device)
- temp_w = self.__get_gaussian_weight_map(window_size)
- temp_w = np.broadcast_to(temp_w, [batch_size, class_num] + window_size)
- temp_w = torch.from_numpy(np.array(temp_w)).to(image.device)
- temp_in_shape = img_full_shape[:2] + window_size
- tempx = torch.ones(temp_in_shape).to(image.device)
- out_num, scale_list = self.__get_prediction_number_and_scales(tempx)
-
- window_num = len(crop_start_list)
- assert(window_num >= window_batch)
- patches_shape = [window_batch, img_chns] + window_size
- patches_in = torch.ones(patches_shape).to(image.device)
- if(out_num == 1): # for a single prediction
- output = torch.zeros(output_shape).to(image.device)
- for w_i in range(0, window_num, window_batch):
- for k in range(window_batch):
- if(w_i + k >= window_num):
- break
- c0 = crop_start_list[w_i + k]
- c1 = [c0[d] + window_size[d] for d in range(img_dim)]
- if(img_dim == 2):
- patches_in[k] = image[:, :, c0[0]:c1[0], c0[1]:c1[1]]
- else:
- patches_in[k] = image[:, :, c0[0]:c1[0], c0[1]:c1[1], c0[2]:c1[2]]
- patches_out = self.model(patches_in)
- if(isinstance(patches_out, (tuple, list))):
- patches_out = patches_out[0]
- for k in range(window_batch):
- if(w_i + k >= window_num):
- break
- c0 = crop_start_list[w_i + k]
- c1 = [c0[d] + window_size[d] for d in range(img_dim)]
- if(img_dim == 2):
- output[:, :, c0[0]:c1[0], c0[1]:c1[1]] += patches_out[k] * temp_w
- weight[:, :, c0[0]:c1[0], c0[1]:c1[1]] += temp_w
- else:
- output[:, :, c0[0]:c1[0], c0[1]:c1[1], c0[2]:c1[2]] += patches_out[k] * temp_w
- weight[:, :, c0[0]:c1[0], c0[1]:c1[1], c0[2]:c1[2]] += temp_w
- return output/weight
- else: # for multiple prediction
- output_list= []
- for i in range(out_num):
- output_shape_i = [batch_size, class_num] + \
- [int(img_shape[d] * scale_list[i][d]) for d in range(img_dim)]
- output_list.append(torch.zeros(output_shape_i).to(image.device))
- temp_ws = [interpolate(temp_w, scale_factor = scale_list[i]) for i in range(out_num)]
- weights = [interpolate(weight, scale_factor = scale_list[i]) for i in range(out_num)]
- for w_i in range(0, window_num, window_batch):
- for k in range(window_batch):
- if(w_i + k >= window_num):
- break
- c0 = crop_start_list[w_i + k]
- c1 = [c0[d] + window_size[d] for d in range(img_dim)]
- if(img_dim == 2):
- patches_in[k] = image[:, :, c0[0]:c1[0], c0[1]:c1[1]]
- else:
- patches_in[k] = image[:, :, c0[0]:c1[0], c0[1]:c1[1], c0[2]:c1[2]]
- patches_out = self.model(patches_in)
-
- for i in range(out_num):
- for k in range(window_batch):
- if(w_i + k >= window_num):
- break
- c0 = crop_start_list[w_i + k]
- c0_i = [int(c0[d] * scale_list[i][d]) for d in range(img_dim)]
- c1_i = [int(c1[d] * scale_list[i][d]) for d in range(img_dim)]
- if(img_dim == 2):
- output_list[i][:, :, c0_i[0]:c1_i[0], c0_i[1]:c1_i[1]] += patches_out[i][k] * temp_ws[i]
- weights[i][:, :, c0_i[0]:c1_i[0], c0_i[1]:c1_i[1]] += temp_ws[i]
- else:
- output_list[i][:, :, c0_i[0]:c1_i[0], c0_i[1]:c1_i[1], c0_i[2]:c1_i[2]] += patches_out[i][k] * temp_ws[i]
- weights[i][:, :, c0_i[0]:c1_i[0], c0_i[1]:c1_i[1], c0_i[2]:c1_i[2]] += temp_ws[i]
- for i in range(out_num):
- output_list[i] = output_list[i] / weights[i]
- return output_list
-
- def run(self, model, image):
- """
- Using `model` for inference on `image`.
-
- :param model: (nn.Module) a network.
- :param image: (tensor) An image.
- """
- self.model = model
- tta_mode = self.config.get('tta_mode', 0)
- if(tta_mode == 0):
- outputs = self.__infer(image)
- elif(tta_mode == 1):
- # test time augmentation with flip in 2D
- # you may define your own method for test time augmentation
- outputs1 = self.__infer(image)
- outputs2 = self.__infer(torch.flip(image, [-2]))
- outputs3 = self.__infer(torch.flip(image, [-1]))
- outputs4 = self.__infer(torch.flip(image, [-2, -1]))
- if(isinstance(outputs1, (tuple, list))):
- outputs = []
- for i in range(len(outputs1)):
- temp_out1 = outputs1[i]
- temp_out2 = torch.flip(outputs2[i], [-2])
- temp_out3 = torch.flip(outputs3[i], [-1])
- temp_out4 = torch.flip(outputs4[i], [-2, -1])
- temp_mean = (temp_out1 + temp_out2 + temp_out3 + temp_out4) / 4
- outputs.append(temp_mean)
- else:
- outputs2 = torch.flip(outputs2, [-2])
- outputs3 = torch.flip(outputs3, [-1])
- outputs4 = torch.flip(outputs4, [-2, -1])
- outputs = (outputs1 + outputs2 + outputs3 + outputs4) / 4
- elif(tta_mode == 2):
- outputs1 = self.__infer(image)
- outputs2 = self.__infer(torch.transpose(image, -1, -3))
- outputs3 = self.__infer(torch.transpose(image, -2, -3))
- if(isinstance(outputs1, (tuple, list))):
- outputs = []
- for i in range(len(outputs1)):
- temp_out1 = outputs1[i]
- temp_out2 = torch.transpose(outputs2[i], -1, -3)
- temp_out3 = torch.transpose(outputs3[i], -2, -3)
- temp_mean = (temp_out1 + temp_out2 + temp_out3) / 3
- outputs.append(temp_mean)
- else:
- outputs2 = torch.transpose(outputs2, -1, -3)
- outputs3 = torch.transpose(outputs3, -2, -3)
- outputs = (outputs1 + outputs2 + outputs3) / 3
- else:
- raise ValueError("Undefined tta_mode {0:}".format(tta_mode))
- return outputs
-
diff --git a/pymic/net_run/noisy_label/__init__.py b/pymic/net_run/noisy_label/__init__.py
deleted file mode 100644
index 448a5e4..0000000
--- a/pymic/net_run/noisy_label/__init__.py
+++ /dev/null
@@ -1,8 +0,0 @@
-from __future__ import absolute_import
-from pymic.net_run.noisy_label.nll_co_teaching import NLLCoTeaching
-from pymic.net_run.noisy_label.nll_trinet import NLLTriNet
-from pymic.net_run.noisy_label.nll_dast import NLLDAST
-
-NLLMethodDict = {'CoTeaching': NLLCoTeaching,
- "TriNet": NLLTriNet,
- "DAST": NLLDAST}
\ No newline at end of file
diff --git a/pymic/net_run/noisy_label/nll_clslsr.py b/pymic/net_run/noisy_label/nll_clslsr.py
deleted file mode 100644
index 3f1059e..0000000
--- a/pymic/net_run/noisy_label/nll_clslsr.py
+++ /dev/null
@@ -1,201 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-import logging
-import os
-import scipy
-import torch
-import numpy as np
-import pandas as pd
-import torch.nn as nn
-import torchvision.transforms as transforms
-from PIL import Image
-from pymic.io.nifty_dataset import NiftyDataset
-from pymic.transform.trans_dict import TransformDict
-from pymic.util.parse_config import *
-from pymic.net_run.agent_seg import SegmentationAgent
-from pymic.net_run.infer_func import Inferer
-
-def get_confident_map(gt, pred, CL_type = 'both'):
- """
- Get the confidence map based on the label and prediction.
-
- :param gt: (tensor) One-hot label with shape of NXC.
- :param pred: (tensor) Digit prediction of network with shape of NXC.
- :param CL_type: (str) A string in {'both', 'Qij', 'Cij', 'intersection',
- 'union', 'prune_by_class', 'prune_by_noise_rate'}.
-
- :return: A tensor representing the noisiness of each pixel.
- """
- try:
- import cleanlab
- assert(cleanlab.__version__ == '1.0.1')
- except:
- raise ValueError("Error: cleanlab 1.0.1 required. Please install it by `pip install cleanlab==1.0.1`")
- prob = scipy.special.softmax(pred, axis = 1)
- if CL_type in ['both', 'Qij']:
- noise = cleanlab.pruning.get_noise_indices(gt, prob, prune_method='both', n_jobs=1)
- elif CL_type == 'Cij':
- noise = cleanlab.pruning.get_noise_indices(gt, pred, prune_method='both', n_jobs=1)
- elif CL_type == 'intersection':
- noise_qij = cleanlab.pruning.get_noise_indices(gt, prob, prune_method='both', n_jobs=1)
- noise_cij = cleanlab.pruning.get_noise_indices(gt, pred, prune_method='both', n_jobs=1)
- noise = noise_qij & noise_cij
- elif CL_type == 'union':
- noise_qij = cleanlab.pruning.get_noise_indices(gt, prob, prune_method='both', n_jobs=1)
- noise_cij = cleanlab.pruning.get_noise_indices(gt, pred, prune_method='both', n_jobs=1)
- noise = noise_qij | noise_cij
- elif CL_type in ['prune_by_class', 'prune_by_noise_rate']:
- noise = cleanlab.pruning.get_noise_indices(gt, prob, prune_method=CL_type, n_jobs=1)
- return noise
-
-class NLLCLSLSR(SegmentationAgent):
- """
- An agent to estimatate the confidence of noisy labels during inference.
-
- * Reference: Minqing Zhang et al., Characterizing Label Errors: Confident Learning
- for Noisy-Labeled Image Segmentation,
- `MICCAI 2020. `_
-
- :param config: (dict) A dictionary containing the configuration.
- :param stage: (str) One of the stage in `train` (default), `inference` or `test`.
-
- """
- def __init__(self, config, stage = 'test'):
- super(NLLCLSLSR, self).__init__(config, stage)
-
- def infer_with_cl(self):
- """
- Inference with confidence estimation.
- """
- device_ids = self.config['testing']['gpus']
- device = torch.device("cuda:{0:}".format(device_ids[0]))
- self.net.to(device)
-
- if(self.config['testing'].get('evaluation_mode', True)):
- self.net.eval()
- if(self.config['testing'].get('test_time_dropout', False)):
- def test_time_dropout(m):
- if(type(m) == nn.Dropout):
- logging.info('dropout layer')
- m.train()
- self.net.apply(test_time_dropout)
-
- ckpt_mode = self.config['testing']['ckpt_mode']
- ckpt_name = self.get_checkpoint_name()
- if(ckpt_mode == 3):
- assert(isinstance(ckpt_name, (tuple, list)))
- self.infer_with_multiple_checkpoints()
- return
- else:
- if(isinstance(ckpt_name, (tuple, list))):
- raise ValueError("ckpt_mode should be 3 if ckpt_name is a list")
-
- # load network parameters and set the network as evaluation mode
- checkpoint = torch.load(ckpt_name, map_location = device)
- self.net.load_state_dict(checkpoint['model_state_dict'])
-
- if(self.inferer is None):
- infer_cfg = self.config['testing']
- class_num = self.config['network']['class_num']
- infer_cfg['class_num'] = class_num
- self.inferer = Inferer(infer_cfg)
- pred_list = []
- gt_list = []
- filename_list = []
- with torch.no_grad():
- for data in self.test_loader:
- images = self.convert_tensor_type(data['image'])
- labels = self.convert_tensor_type(data['label_prob'])
- names = data['names']
- filename_list.append(names)
- images = images.to(device)
-
- pred = self.inferer.run(self.net, images)
- # convert tensor to numpy
- if(isinstance(pred, (tuple, list))):
- pred = [item.cpu().numpy() for item in pred]
- else:
- pred = pred.cpu().numpy()
- data['predict'] = pred
- # inverse transform
- for transform in self.transform_list[::-1]:
- if (transform.inverse):
- data = transform.inverse_transform_for_prediction(data)
-
- pred = data['predict']
- # conver prediction from N, C, H, W to (N*H*W)*C
- print(names, pred.shape, labels.shape)
- pred_2d = np.swapaxes(pred, 1, 2)
- pred_2d = np.swapaxes(pred_2d, 2, 3)
- pred_2d = pred_2d.reshape(-1, class_num)
- lab = labels.cpu().numpy()
- lab_2d = np.swapaxes(lab, 1, 2)
- lab_2d = np.swapaxes(lab_2d, 2, 3)
- lab_2d = lab_2d.reshape(-1, class_num)
- pred_list.append(pred_2d)
- gt_list.append(lab_2d)
-
- pred_cat = np.concatenate(pred_list)
- gt_cat = np.concatenate(gt_list)
- gt = np.argmax(gt_cat, axis = 1)
- gt = gt.reshape(-1).astype(np.uint8)
- print(gt.shape, pred_cat.shape)
- conf = get_confident_map(gt, pred_cat)
- conf = conf.reshape(-1, 256, 256).astype(np.uint8) * 255
- save_dir = self.config['dataset']['train_dir'] + "/slsr_conf"
- for idx in range(len(filename_list)):
- filename = filename_list[idx][0][0].split('/')[-1]
- conf_map = Image.fromarray(conf[idx])
- dst_path = os.path.join(save_dir, filename)
- conf_map.save(dst_path)
-
-def get_confidence_map(cfg_file):
- config = parse_config(cfg_file)
- config = synchronize_config(config)
- agent = NLLCLSLSR(config, 'test')
-
- # set customized dataset for testing, i.e,. inference with training images
- trans_names, trans_params = agent.get_transform_names_and_parameters('valid')
- transform_list = []
- if(trans_names is not None and len(trans_names) > 0):
- for name in trans_names:
- if(name not in agent.transform_dict):
- raise(ValueError("Undefined transform {0:}".format(name)))
- one_transform = agent.transform_dict[name](trans_params)
- transform_list.append(one_transform)
- data_transform = transforms.Compose(transform_list)
-
- stage_dir = config['dataset']['train_dir']
- csv_file = config['dataset']['train_csv']
- modal_num = config['dataset'].get('modal_num', 1)
- stage_dim = config['dataset'].get('train_dim', 3)
- lab_key = config['dataset'].get('train_label_key', 'label')
-
- dataset = NiftyDataset(root_dir = stage_dir,
- csv_file = csv_file,
- modal_num = modal_num,
- image_dim = stage_dim,
- allow_missing_modal = False,
- label_key = lab_key,
- transform = data_transform,
- task = agent.task_type)
-
- agent.set_datasets(None, None, dataset)
- agent.transform_list = transform_list
- agent.create_dataset()
- agent.create_network()
- agent.infer_with_cl()
-
- # create training csv for confidence learning
- df_train = pd.read_csv(csv_file)
- pixel_weight = []
- for i in range(len(df_train["label"])):
- lab_name = df_train["label"][i].split('/')[-1]
- weight_name = "slsr_conf/" + lab_name
- pixel_weight.append(weight_name)
- train_cl_dict = {"image": df_train["image"],
- "pixel_weight": pixel_weight,
- "label": df_train["label"]}
- train_cl_csv = csv_file.replace(".csv", "_clslsr.csv")
- df_cl = pd.DataFrame.from_dict(train_cl_dict)
- df_cl.to_csv(train_cl_csv, index = False)
\ No newline at end of file
diff --git a/pymic/net_run/noisy_label/nll_co_teaching.py b/pymic/net_run/noisy_label/nll_co_teaching.py
deleted file mode 100644
index 33e375c..0000000
--- a/pymic/net_run/noisy_label/nll_co_teaching.py
+++ /dev/null
@@ -1,165 +0,0 @@
-# -*- coding: utf-8 -*-
-
-from __future__ import print_function, division
-import logging
-import os
-import sys
-import numpy as np
-import time
-import torch
-import torch.nn as nn
-from pymic.loss.seg.util import get_soft_label
-from pymic.loss.seg.util import reshape_prediction_and_ground_truth
-from pymic.loss.seg.util import get_classwise_dice
-from pymic.loss.seg.util import reshape_tensor_to_2D
-from pymic.net_run.agent_seg import SegmentationAgent
-from pymic.util.parse_config import *
-from pymic.util.ramps import get_rampup_ratio
-
-class NLLCoTeaching(SegmentationAgent):
- """
- Co-teaching for noisy-label learning.
-
- * Reference: Bo Han, Quanming Yao, Xingrui Yu, Gang Niu, Miao Xu, Weihua Hu,
- Ivor Tsang, Masashi Sugiyama. Co-teaching: Robust Training of Deep Neural Networks with Extremely
- Noisy Labels. `NeurIPS 201. `_
-
- :param config: (dict) A dictionary containing the configuration.
- :param stage: (str) One of the stage in `train` (default), `inference` or `test`.
-
- .. note::
-
- In the configuration dictionary, in addition to the four sections (`dataset`,
- `network`, `training` and `inference`) used in fully supervised learning, an
- extra section `noisy_label_learning` is needed. See :doc:`usage.nll` for details.
- """
- def __init__(self, config, stage = 'train'):
- super(NLLCoTeaching, self).__init__(config, stage)
- loss_type = config['training']["loss_type"]
- if(loss_type != "CrossEntropyLoss"):
- logging.warn("only CrossEntropyLoss supported for" +
- " coteaching, the specified loss {0:} is ingored".format(loss_type))
-
- def training(self):
- class_num = self.config['network']['class_num']
- iter_valid = self.config['training']['iter_valid']
- nll_cfg = self.config['noisy_label_learning']
- select_ratio = nll_cfg['co_teaching_select_ratio']
- iter_max = self.config['training']['iter_max']
- rampup_start = nll_cfg.get('rampup_start', 0)
- rampup_end = nll_cfg.get('rampup_end', iter_max)
-
- train_loss_no_select1, train_loss_no_select2 = 0, 0
- train_loss1, train_avg_loss1 = 0, 0
- train_loss2, train_avg_loss2 = 0, 0
- train_dice_list = []
- data_time, gpu_time, loss_time, back_time = 0, 0, 0, 0
- self.net.train()
- for it in range(iter_valid):
- t0 = time.time()
- try:
- data = next(self.trainIter)
- except StopIteration:
- self.trainIter = iter(self.train_loader)
- data = next(self.trainIter)
- t1 = time.time()
- # get the inputs
- inputs = self.convert_tensor_type(data['image'])
- labels_prob = self.convert_tensor_type(data['label_prob'])
- inputs, labels_prob = inputs.to(self.device), labels_prob.to(self.device)
-
- # zero the parameter gradients
- self.optimizer.zero_grad()
-
- # forward + backward + optimize
- outputs1, outputs2 = self.net(inputs)
- t2 = time.time()
- prob1 = nn.Softmax(dim = 1)(outputs1)
- prob2 = nn.Softmax(dim = 1)(outputs2)
- prob1_2d = reshape_tensor_to_2D(prob1) * 0.999 + 5e-4
- prob2_2d = reshape_tensor_to_2D(prob2) * 0.999 + 5e-4
- y_2d = reshape_tensor_to_2D(labels_prob)
-
- loss1 = - y_2d* torch.log(prob1_2d)
- loss1 = torch.sum(loss1, dim = 1) # shape is [N]
- ind_1_sorted = torch.argsort(loss1)
-
- loss2 = - y_2d* torch.log(prob2_2d)
- loss2 = torch.sum(loss2, dim = 1) # shape is [N]
- ind_2_sorted = torch.argsort(loss2)
-
- rampup_ratio = get_rampup_ratio(self.glob_it, rampup_start, rampup_end, "sigmoid")
- forget_ratio = (1 - select_ratio) * rampup_ratio
- remb_ratio = 1 - forget_ratio
- num_remb = int(remb_ratio * len(loss1))
-
- ind_1_update = ind_1_sorted[:num_remb]
- ind_2_update = ind_2_sorted[:num_remb]
-
- loss1_select = loss1[ind_2_update]
- loss2_select = loss2[ind_1_update]
-
- loss = loss1_select.mean() + loss2_select.mean()
- t3 = time.time()
- loss.backward()
- t4 = time.time()
- self.optimizer.step()
-
- train_loss_no_select1 = train_loss_no_select1 + loss1.mean().item()
- train_loss_no_select2 = train_loss_no_select2 + loss2.mean().item()
- train_loss1 = train_loss1 + loss1_select.mean().item()
- train_loss2 = train_loss2 + loss2_select.mean().item()
-
- outputs1_argmax = torch.argmax(outputs1, dim = 1, keepdim = True)
- soft_out1 = get_soft_label(outputs1_argmax, class_num, self.tensor_type)
- soft_out1, labels_prob = reshape_prediction_and_ground_truth(soft_out1, labels_prob)
- dice_list = get_classwise_dice(soft_out1, labels_prob).detach().cpu().numpy()
- train_dice_list.append(dice_list)
-
- data_time = data_time + t1 - t0
- gpu_time = gpu_time + t2 - t1
- loss_time = loss_time + t3 - t2
- back_time = back_time + t4 - t3
- train_avg_loss_no_select1 = train_loss_no_select1 / iter_valid
- train_avg_loss_no_select2 = train_loss_no_select2 / iter_valid
- train_avg_loss1 = train_loss1 / iter_valid
- train_avg_loss2 = train_loss2 / iter_valid
- train_cls_dice = np.asarray(train_dice_list).mean(axis = 0)
- train_avg_dice = train_cls_dice[1:].mean()
-
- train_scalers = {'loss': (train_avg_loss1 + train_avg_loss2) / 2,
- 'loss1':train_avg_loss1, 'loss2': train_avg_loss2,
- 'loss_no_select1':train_avg_loss_no_select1,
- 'loss_no_select2':train_avg_loss_no_select2,
- 'select_ratio':remb_ratio, 'avg_fg_dice':train_avg_dice, 'class_dice': train_cls_dice,
- 'data_time': data_time, 'forward_time':gpu_time,
- 'loss_time':loss_time, 'backward_time':back_time }
- return train_scalers
-
- def write_scalars(self, train_scalars, valid_scalars, lr_value, glob_it):
- loss_scalar ={'train':train_scalars['loss'],
- 'valid':valid_scalars['loss']}
- loss_no_select_scalar = {'net1':train_scalars['loss_no_select1'],
- 'net2':train_scalars['loss_no_select2']}
-
- dice_scalar ={'train':train_scalars['avg_fg_dice'], 'valid':valid_scalars['avg_fg_dice']}
- self.summ_writer.add_scalars('loss', loss_scalar, glob_it)
- self.summ_writer.add_scalars('loss_no_select', loss_no_select_scalar, glob_it)
- self.summ_writer.add_scalars('select_ratio', {'select_ratio':train_scalars['select_ratio']}, glob_it)
- self.summ_writer.add_scalars('lr', {"lr": lr_value}, glob_it)
- self.summ_writer.add_scalars('dice', dice_scalar, glob_it)
- class_num = self.config['network']['class_num']
- for c in range(class_num):
- cls_dice_scalar = {'train':train_scalars['class_dice'][c], \
- 'valid':valid_scalars['class_dice'][c]}
- self.summ_writer.add_scalars('class_{0:}_dice'.format(c), cls_dice_scalar, glob_it)
-
- logging.info('train loss {0:.4f}, avg foreground dice {1:.4f} '.format(
- train_scalars['loss'], train_scalars['avg_fg_dice']) + "[" + \
- ' '.join("{0:.4f}".format(x) for x in train_scalars['class_dice']) + "]")
- logging.info('valid loss {0:.4f}, avg foreground dice {1:.4f} '.format(
- valid_scalars['loss'], valid_scalars['avg_fg_dice']) + "[" + \
- ' '.join("{0:.4f}".format(x) for x in valid_scalars['class_dice']) + "]")
- logging.info("data: {0:.2f}s, forward: {1:.2f}s, loss: {2:.2f}s, backward: {3:.2f}s".format(
- train_scalars['data_time'], train_scalars['forward_time'],
- train_scalars['loss_time'], train_scalars['backward_time']))
diff --git a/pymic/net_run/noisy_label/nll_dast.py b/pymic/net_run/noisy_label/nll_dast.py
deleted file mode 100644
index 95203ba..0000000
--- a/pymic/net_run/noisy_label/nll_dast.py
+++ /dev/null
@@ -1,282 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-import numpy as np
-import random
-import torch
-import time
-import torch.nn as nn
-import torchvision.transforms as transforms
-from pymic.io.nifty_dataset import NiftyDataset
-from pymic.loss.seg.util import get_soft_label
-from pymic.loss.seg.util import reshape_prediction_and_ground_truth
-from pymic.loss.seg.util import get_classwise_dice
-from pymic.net_run.agent_seg import SegmentationAgent
-from pymic.util.parse_config import *
-from pymic.util.ramps import get_rampup_ratio
-
-class Rank(object):
- """
- Dynamically rank the current training sample with specific metrics.
-
- :param quene_length: (int) The lenght for a quene.
- """
- def __init__(self, quene_length = 100):
- self.vals = []
- self.quene_length = quene_length
-
- def add_val(self, val):
- """
- Update the quene and calculate the order of the input value.
-
- :param val: (float) a value adding to the quene.
- :return: rank of the input value with a range of (0, self.quene_length)
- """
- if len(self.vals) < self.quene_length:
- self.vals.append(val)
- rank = -1
- else:
- self.vals.pop(0)
- self.vals.append(val)
- assert len(self.vals) == self.quene_length
- idxes = np.argsort(self.vals)
- rank = np.where(idxes == self.quene_length-1)[0][0]
- return rank
-
-class ConsistLoss(nn.Module):
- def __init__(self):
- super(ConsistLoss, self).__init__()
-
- def kl_div_map(self, input, label):
- kl_map = torch.sum(label * (torch.log(label + 1e-16) - torch.log(input + 1e-16)), dim = 1)
- return kl_map
-
- def kl_loss(self,input, target, size_average=True):
- kl_div = self.kl_div_map(input, target)
- if size_average:
- return torch.mean(kl_div)
- else:
- return kl_div
-
- def forward(self, input1, input2, size_average = True):
- kl1 = self.kl_loss(input1, input2.detach(), size_average=size_average)
- kl2 = self.kl_loss(input2, input1.detach(), size_average=size_average)
- return (kl1 + kl2) / 2
-
-def get_ce(prob, soft_y, size_avg = True):
- prob = prob * 0.999 + 5e-4
- ce = - soft_y* torch.log(prob)
- ce = torch.sum(ce, dim = 1) # shape is [N]
- if(size_avg):
- ce = torch.mean(ce)
- return ce
-
-@torch.no_grad()
-def select_criterion(no_noisy_sample, cl_noisy_sample, label):
- """
- Obtain the sample selection criterion score.
-
- :param no_noisy_sample: noisy branch's output probability for noisy sample.
- :param cl_noisy_sample: clean branch's output probability for noisy sample.
- :param label: noisy label.
- """
- l_n = get_ce(no_noisy_sample, label, size_avg = False)
- l_c = get_ce(cl_noisy_sample, label, size_avg = False)
- js_distance = ConsistLoss()
- variance = js_distance(no_noisy_sample, cl_noisy_sample, size_average=False)
- exp_variance = torch.exp(-16 * variance)
- loss_n = torch.mean(l_c * exp_variance).item()
- loss_c = torch.mean(l_n * exp_variance).item()
- return loss_n, loss_c
-
-class NLLDAST(SegmentationAgent):
- """
- Divergence-Aware Selective Training for noisy label learning.
-
- * Reference: Shuojue Yang, Guotai Wang, Hui Sun, Xiangde Luo, Peng Sun,
- Kang Li, Qijun Wang, Shaoting Zhang: Learning COVID-19 Pneumonia Lesion
- Segmentation from Imperfect Annotations via Divergence-Aware Selective Training.
- `JBHI 2022. `_
-
- :param config: (dict) A dictionary containing the configuration.
- :param stage: (str) One of the stage in `train` (default), `inference` or `test`.
-
- .. note::
-
- In the configuration dictionary, in addition to the four sections (`dataset`,
- `network`, `training` and `inference`) used in fully supervised learning, an
- extra section `noisy_label_learning` is needed. See :doc:`usage.nll` for details.
- """
- def __init__(self, config, stage = 'train'):
- super(NLLDAST, self).__init__(config, stage)
- self.train_set_noise = None
- self.train_loader_noise = None
- self.trainIter_noise = None
- self.noisy_rank = None
- self.clean_rank = None
-
- def get_noisy_dataset_from_config(self):
- """
- Create a dataset for images with noisy labels based on configuraiton.
- """
- trans_names, trans_params = self.get_transform_names_and_parameters('train')
- transform_list = []
- if(trans_names is not None and len(trans_names) > 0):
- for name in trans_names:
- if(name not in self.transform_dict):
- raise(ValueError("Undefined transform {0:}".format(name)))
- one_transform = self.transform_dict[name](trans_params)
- transform_list.append(one_transform)
- data_transform = transforms.Compose(transform_list)
-
- modal_num = self.config['dataset'].get('modal_num', 1)
- stage_dim = self.config['dataset'].get('train_dim', 3)
- lab_key = self.config['dataset'].get('train_label_key', 'label')
- csv_file = self.config['dataset'].get('train_csv_noise', None)
- dataset = NiftyDataset(root_dir = self.config['dataset']['train_dir'],
- csv_file = csv_file,
- modal_num = modal_num,
- image_dim = stage_dim,
- allow_missing_modal = False,
- label_key = lab_key,
- transform = data_transform,
- task = self.task_type)
- return dataset
-
-
- def create_dataset(self):
- super(NLLDAST, self).create_dataset()
- if(self.stage == 'train'):
- if(self.train_set_noise is None):
- self.train_set_noise = self.get_noisy_dataset_from_config()
- if(self.deterministic):
- def worker_init_fn(worker_id):
- random.seed(self.random_seed + worker_id)
- worker_init = worker_init_fn
- else:
- worker_init = None
-
- bn_train_noise = self.config['dataset']['train_batch_size_noise']
- num_worker = self.config['dataset'].get('num_worker', 16)
- self.train_loader_noise = torch.utils.data.DataLoader(self.train_set_noise,
- batch_size = bn_train_noise, shuffle=True, num_workers= num_worker,
- worker_init_fn=worker_init)
-
- def training(self):
- class_num = self.config['network']['class_num']
- iter_valid = self.config['training']['iter_valid']
- nll_cfg = self.config['noisy_label_learning']
- iter_max = self.config['training']['iter_max']
- rampup_start = nll_cfg.get('rampup_start', 0)
- rampup_end = nll_cfg.get('rampup_end', iter_max)
- train_loss, train_loss_sup, train_loss_reg = 0, 0, 0
- train_dice_list = []
- data_time, gpu_time, loss_time, back_time = 0, 0, 0, 0
- self.net.train()
-
- rank_length = nll_cfg.get("dast_rank_length", 20)
- consist_loss = ConsistLoss()
- for it in range(iter_valid):
- t0 = time.time()
- try:
- data_cl = next(self.trainIter)
- except StopIteration:
- self.trainIter = iter(self.train_loader)
- data_cl = next(self.trainIter)
- try:
- data_no = next(self.trainIter_noise)
- except StopIteration:
- self.trainIter_noise = iter(self.train_loader_noise)
- data_no = next(self.trainIter_noise)
- t1 = time.time()
- # get the inputs
- x0 = self.convert_tensor_type(data_cl['image']) # clean sample
- y0 = self.convert_tensor_type(data_cl['label_prob'])
- x1 = self.convert_tensor_type(data_no['image']) # noisy sample
- y1 = self.convert_tensor_type(data_no['label_prob'])
- inputs = torch.cat([x0, x1], dim = 0).to(self.device)
- y0, y1 = y0.to(self.device), y1.to(self.device)
-
- # zero the parameter gradients
- self.optimizer.zero_grad()
-
- # forward + backward + optimize
- b0_pred, b1_pred = self.net(inputs)
- t2 = time.time()
- n0 = list(x0.shape)[0] # number of clean samples
- b0_x0_pred = b0_pred[:n0] # predication of clean samples from clean branch
- b0_x1_pred = b0_pred[n0:] # predication of noisy samples from clean branch
- b1_x1_pred = b1_pred[n0:] # predication of noisy samples from noisy branch
-
- # supervised loss for the clean and noisy branches, respectively
- loss_sup_cl = self.get_loss_value(data_cl, b0_x0_pred, y0)
- loss_sup_no = self.get_loss_value(data_no, b1_x1_pred, y1)
- loss_sup = (loss_sup_cl + loss_sup_no) / 2
- loss = loss_sup
-
- # Severe Noise supression & Supplementary Training
- rampup_ratio = get_rampup_ratio(self.glob_it, rampup_start, rampup_end, "sigmoid")
- w_dbc = nll_cfg.get('dast_dbc_w', 0.1) * rampup_ratio
- w_st = nll_cfg.get('dast_st_w', 0.1) * rampup_ratio
- b1_x1_prob = nn.Softmax(dim = 1)(b1_x1_pred)
- b0_x1_prob = nn.Softmax(dim = 1)(b0_x1_pred)
- loss_n, loss_c = select_criterion(b1_x1_prob, b0_x1_prob, y1)
- rank_n = self.noisy_rank.add_val(loss_n)
- rank_c = self.clean_rank.add_val(loss_c)
- if loss_n < loss_c:
- select_ratio = nll_cfg.get('dast_select_ratio', 0.2)
- if rank_c >= rank_length * (1 - select_ratio):
- loss_dbc = consist_loss(b1_x1_prob, b0_x1_prob)
- loss = loss + loss_dbc * w_dbc
- if rank_n <= rank_length * select_ratio:
- b0_x1_argmax = torch.argmax(b0_x1_pred, dim = 1, keepdim = True)
- b0_x1_lab = get_soft_label(b0_x1_argmax, class_num, self.tensor_type)
- b1_x1_argmax = torch.argmax(b1_x1_pred, dim = 1, keepdim = True)
- b1_x1_lab = get_soft_label(b1_x1_argmax, class_num, self.tensor_type)
- pseudo_label = (b0_x1_lab + b1_x1_lab + y1) / 3
- sharpen = lambda p,T: p**(1.0/T)/(p**(1.0/T) + (1-p)**(1.0/T))
- b0_x1_prob = nn.Softmax(dim = 1)(b0_x1_pred)
- loss_st = torch.mean(torch.abs(b0_x1_prob - sharpen(pseudo_label, 0.5)))
- loss = loss + loss_st * w_st
- t3 = time.time()
- loss.backward()
- t4 = time.time()
- self.optimizer.step()
-
- train_loss = train_loss + loss.item()
- train_loss_sup = train_loss_sup + loss_sup.item()
- # train_loss_reg = train_loss_reg + loss_reg.item()
- # get dice evaluation for each class in annotated images
- if(isinstance(b0_x0_pred, tuple) or isinstance(b0_x0_pred, list)):
- p0 = b0_x0_pred[0]
- else:
- p0 = b0_x0_pred
- p0_argmax = torch.argmax(p0, dim = 1, keepdim = True)
- p0_soft = get_soft_label(p0_argmax, class_num, self.tensor_type)
- p0_soft, y0 = reshape_prediction_and_ground_truth(p0_soft, y0)
- dice_list = get_classwise_dice(p0_soft, y0)
- train_dice_list.append(dice_list.cpu().numpy())
-
- data_time = data_time + t1 - t0
- gpu_time = gpu_time + t2 - t1
- loss_time = loss_time + t3 - t2
- back_time = back_time + t4 - t3
- train_avg_loss = train_loss / iter_valid
- train_avg_loss_sup = train_loss_sup / iter_valid
- train_avg_loss_reg = train_loss_reg / iter_valid
- train_cls_dice = np.asarray(train_dice_list).mean(axis = 0)
- train_avg_dice = train_cls_dice[1:].mean()
-
- train_scalers = {'loss': train_avg_loss, 'loss_sup':train_avg_loss_sup,
- 'loss_reg':train_avg_loss_reg, 'regular_w':w_dbc,
- 'avg_fg_dice':train_avg_dice, 'class_dice': train_cls_dice,
- 'data_time': data_time, 'forward_time':gpu_time,
- 'loss_time':loss_time, 'backward_time':back_time }
- return train_scalers
-
- def train_valid(self):
- self.trainIter_noise = iter(self.train_loader_noise)
- nll_cfg = self.config['noisy_label_learning']
- rank_length = nll_cfg.get("dast_rank_length", 20)
- self.noisy_rank = Rank(rank_length)
- self.clean_rank = Rank(rank_length)
- super(NLLDAST, self).train_valid()
\ No newline at end of file
diff --git a/pymic/net_run/noisy_label/nll_trinet.py b/pymic/net_run/noisy_label/nll_trinet.py
deleted file mode 100644
index 4c4198f..0000000
--- a/pymic/net_run/noisy_label/nll_trinet.py
+++ /dev/null
@@ -1,161 +0,0 @@
-# -*- coding: utf-8 -*-
-
-from __future__ import print_function, division
-import logging
-import numpy as np
-import time
-import torch
-import torch.nn as nn
-import torch.optim as optim
-from pymic.loss.seg.util import get_soft_label
-from pymic.loss.seg.util import reshape_prediction_and_ground_truth
-from pymic.loss.seg.util import get_classwise_dice
-from pymic.loss.seg.util import reshape_tensor_to_2D
-from pymic.net_run.agent_seg import SegmentationAgent
-from pymic.net.net_dict_seg import SegNetDict
-from pymic.util.parse_config import *
-from pymic.util.ramps import get_rampup_ratio
-
-class NLLTriNet(SegmentationAgent):
- """
- Implementation of trinet for learning from noisy samples for
- segmentation tasks.
-
- * Reference: Tianwei Zhang, Lequan Yu, Na Hu, Su Lv, Shi Gu:
- Robust Medical Image Segmentation from Non-expert Annotations with Tri-network.
- `MICCAI 2020. `_
-
- :param config: (dict) A dictionary containing the configuration.
- :param stage: (str) One of the stage in `train` (default), `inference` or `test`.
-
- .. note::
-
- In the configuration dictionary, in addition to the four sections (`dataset`,
- `network`, `training` and `inference`) used in fully supervised learning, an
- extra section `noisy_label_learning` is needed. See :doc:`usage.nll` for details.
- """
- def __init__(self, config, stage = 'train'):
- super(NLLTriNet, self).__init__(config, stage)
-
- def get_loss_and_confident_mask(self, pred, labels_prob, conf_ratio):
- prob = nn.Softmax(dim = 1)(pred)
- prob_2d = reshape_tensor_to_2D(prob) * 0.999 + 5e-4
- y_2d = reshape_tensor_to_2D(labels_prob)
-
- loss = - y_2d* torch.log(prob_2d)
- loss = torch.sum(loss, dim = 1) # shape is [N]
- threshold = torch.quantile(loss, conf_ratio)
- mask = loss < threshold
- return loss, mask
-
- def training(self):
- class_num = self.config['network']['class_num']
- iter_valid = self.config['training']['iter_valid']
- nll_cfg = self.config['noisy_label_learning']
- iter_max = self.config['training']['iter_max']
- select_ratio = nll_cfg['trinet_select_ratio']
- rampup_start = nll_cfg.get('rampup_start', 0)
- rampup_end = nll_cfg.get('rampup_end', iter_max)
-
- train_loss_no_select1 = 0
- train_loss_no_select2 = 0
- train_loss1, train_loss2, train_loss3 = 0, 0, 0
- train_dice_list = []
- data_time, gpu_time, loss_time, back_time = 0, 0, 0, 0
- self.net.train()
- for it in range(iter_valid):
- t0 = time.time()
- try:
- data = next(self.trainIter)
- except StopIteration:
- self.trainIter = iter(self.train_loader)
- data = next(self.trainIter)
- t1 = time.time()
- # get the inputs
- inputs = self.convert_tensor_type(data['image'])
- labels_prob = self.convert_tensor_type(data['label_prob'])
- inputs, labels_prob = inputs.to(self.device), labels_prob.to(self.device)
-
- # zero the parameter gradients
- self.optimizer.zero_grad()
-
- # forward + backward + optimize
- outputs1, outputs2, outputs3 = self.net(inputs)
- t2 = time.time()
- rampup_ratio = get_rampup_ratio(self.glob_it, rampup_start, rampup_end)
- forget_ratio = (1 - select_ratio) * rampup_ratio
- remb_ratio = 1 - forget_ratio
-
- loss1, mask1 = self.get_loss_and_confident_mask(outputs1, labels_prob, remb_ratio)
- loss2, mask2 = self.get_loss_and_confident_mask(outputs2, labels_prob, remb_ratio)
- loss3, mask3 = self.get_loss_and_confident_mask(outputs3, labels_prob, remb_ratio)
- mask12, mask13, mask23 = mask1 * mask2, mask1 * mask3, mask2 * mask3
- mask12, mask13, mask23 = mask12.detach(), mask13.detach(), mask23.detach()
-
- loss1_avg = torch.sum(loss1 * mask23) / mask23.sum()
- loss2_avg = torch.sum(loss2 * mask13) / mask13.sum()
- loss3_avg = torch.sum(loss3 * mask12) / mask12.sum()
- loss = (loss1_avg + loss2_avg + loss3_avg) / 3
- t3 = time.time()
- loss.backward()
- t4 = time.time()
- self.optimizer.step()
-
- train_loss_no_select1 = train_loss_no_select1 + loss1.mean().item()
- train_loss_no_select2 = train_loss_no_select2 + loss2.mean().item()
- train_loss1 = train_loss1 + loss1_avg.item()
- train_loss2 = train_loss2 + loss2_avg.item()
-
- outputs1_argmax = torch.argmax(outputs1, dim = 1, keepdim = True)
- soft_out1 = get_soft_label(outputs1_argmax, class_num, self.tensor_type)
- soft_out1, labels_prob = reshape_prediction_and_ground_truth(soft_out1, labels_prob)
- dice_list = get_classwise_dice(soft_out1, labels_prob).detach().cpu().numpy()
- train_dice_list.append(dice_list)
-
- data_time = data_time + t1 - t0
- gpu_time = gpu_time + t2 - t1
- loss_time = loss_time + t3 - t2
- back_time = back_time + t4 - t3
- train_avg_loss_no_select1 = train_loss_no_select1 / iter_valid
- train_avg_loss_no_select2 = train_loss_no_select2 / iter_valid
- train_avg_loss1 = train_loss1 / iter_valid
- train_avg_loss2 = train_loss2 / iter_valid
- train_cls_dice = np.asarray(train_dice_list).mean(axis = 0)
- train_avg_dice = train_cls_dice[1:].mean()
-
- train_scalers = {'loss': (train_avg_loss1 + train_avg_loss2) / 2,
- 'loss1':train_avg_loss1, 'loss2': train_avg_loss2,
- 'loss_no_select1':train_avg_loss_no_select1,
- 'loss_no_select2':train_avg_loss_no_select2,
- 'select_ratio':remb_ratio, 'avg_fg_dice':train_avg_dice, 'class_dice': train_cls_dice,
- 'data_time': data_time, 'forward_time':gpu_time,
- 'loss_time':loss_time, 'backward_time':back_time }
- return train_scalers
-
- def write_scalars(self, train_scalars, valid_scalars, lr_value, glob_it):
- loss_scalar ={'train':train_scalars['loss'],
- 'valid':valid_scalars['loss']}
- loss_no_select_scalar = {'net1':train_scalars['loss_no_select1'],
- 'net2':train_scalars['loss_no_select2']}
-
- dice_scalar ={'train':train_scalars['avg_fg_dice'], 'valid':valid_scalars['avg_fg_dice']}
- self.summ_writer.add_scalars('loss', loss_scalar, glob_it)
- self.summ_writer.add_scalars('loss_no_select', loss_no_select_scalar, glob_it)
- self.summ_writer.add_scalars('select_ratio', {'select_ratio':train_scalars['select_ratio']}, glob_it)
- self.summ_writer.add_scalars('lr', {"lr": lr_value}, glob_it)
- self.summ_writer.add_scalars('dice', dice_scalar, glob_it)
- class_num = self.config['network']['class_num']
- for c in range(class_num):
- cls_dice_scalar = {'train':train_scalars['class_dice'][c], \
- 'valid':valid_scalars['class_dice'][c]}
- self.summ_writer.add_scalars('class_{0:}_dice'.format(c), cls_dice_scalar, glob_it)
-
- logging.info('train loss {0:.4f}, avg foregournd dice {1:.4f} '.format(
- train_scalars['loss'], train_scalars['avg_fg_dice']) + "[" + \
- ' '.join("{0:.4f}".format(x) for x in train_scalars['class_dice']) + "]")
- logging.info('valid loss {0:.4f}, avg foreground dice {1:.4f} '.format(
- valid_scalars['loss'], valid_scalars['avg_fg_dice']) + "[" + \
- ' '.join("{0:.4f}".format(x) for x in valid_scalars['class_dice']) + "]")
- logging.info("data: {0:.2f}s, forward: {1:.2f}s, loss: {2:.2f}s, backward: {3:.2f}s".format(
- train_scalars['data_time'], train_scalars['forward_time'],
- train_scalars['loss_time'], train_scalars['backward_time']))
diff --git a/pymic/net_run/predict.py b/pymic/net_run/predict.py
deleted file mode 100644
index d63cbad..0000000
--- a/pymic/net_run/predict.py
+++ /dev/null
@@ -1,71 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-import argparse
-import logging
-import os
-import sys
-from datetime import datetime
-from pymic import TaskType
-from pymic.util.parse_config import *
-from pymic.net_run.agent_cls import ClassificationAgent
-from pymic.net_run.agent_seg import SegmentationAgent
-from pymic.net_run.agent_rec import ReconstructionAgent
-
-def main():
- """
- The main function for running a network for inference.
- """
- if(len(sys.argv) < 2):
- print('Number of arguments should be at least 2. e.g.')
- print(' pymic_test config.cfg -test_csv train.csv -output_dir result_dir -ckpt_mode 1')
- exit()
- parser = argparse.ArgumentParser()
- parser.add_argument("cfg", help="configuration file for testing")
- parser.add_argument("--test_csv", help="the csv file for testing images",
- required=False, default=None)
- parser.add_argument("--test_dir", help="the dir for testing images",
- required=False, default=None)
- parser.add_argument("--output_dir", help="the output dir for inference results",
- required=False, default=None)
- parser.add_argument("--ckpt_dir", help="the dir for trained model",
- required=False, default=None)
- parser.add_argument("--ckpt_mode", help="the mode for chekpoint: 0-latest, 1-best, 2-customized",
- required=False, default=None)
- parser.add_argument("--ckpt_name", help="the name chekpoint if ckpt_mode = 2",
- required=False, default=None)
- parser.add_argument("--gpus", help="the gpus for runing, e.g., [0]",
- required=False, default=None)
- args = parser.parse_args()
- if(not os.path.isfile(args.cfg)):
- raise ValueError("The config file does not exist: " + args.cfg)
- config = parse_config(args)
- config = synchronize_config(config)
- print(config)
- log_dir = config['testing']['output_dir']
- if(not os.path.exists(log_dir)):
- os.makedirs(log_dir, exist_ok=True)
-
- if sys.version.startswith("3.9"):
- logging.basicConfig(filename=log_dir+"/log_test.txt",
- level=logging.INFO, format='%(message)s', force=True) # for python 3.9
- else:
- logging.basicConfig(filename=log_dir+"/log_test.txt",
- level=logging.INFO, format='%(message)s') # for python 3.6
- logging.getLogger().addHandler(logging.StreamHandler(sys.stdout))
- dst_cfg = args.cfg if "/" not in args.cfg else args.cfg.split("/")[-1]
- wrtie_config(config, log_dir + "/" + dst_cfg)
- task = config['dataset']['task_type']
- if(task == TaskType.CLASSIFICATION_ONE_HOT or task == TaskType.CLASSIFICATION_COEXIST):
- agent = ClassificationAgent(config, 'test')
- elif(task == TaskType.SEGMENTATION):
- agent = SegmentationAgent(config, 'test')
- elif(task == TaskType.RECONSTRUCTION):
- agent = ReconstructionAgent(config, 'test')
- else:
- raise ValueError("Undefined task for inference: {0:}".format(task))
- agent.run()
-
-if __name__ == "__main__":
- main()
-
-
diff --git a/pymic/net_run/preprocess.py b/pymic/net_run/preprocess.py
deleted file mode 100644
index 63410b5..0000000
--- a/pymic/net_run/preprocess.py
+++ /dev/null
@@ -1,33 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-import argparse
-import os
-import sys
-from datetime import datetime
-from pymic.util.parse_config import *
-from pymic.net_run.agent_preprocess import PreprocessAgent
-
-
-def main():
- """
- The main function for data preprocessing.
- """
- if(len(sys.argv) < 2):
- print('Number of arguments should be 2. e.g.')
- print(' pymic_preprocess config.cfg')
- exit()
- parser = argparse.ArgumentParser()
- parser.add_argument("cfg", help="configuration file for preprocessing")
- args = parser.parse_args()
- if(not os.path.isfile(args.cfg)):
- raise ValueError("The config file does not exist: " + args.cfg)
- config = parse_config(args)
- config = synchronize_config(config)
- agent = PreprocessAgent(config)
- agent.run()
-
-if __name__ == "__main__":
- main()
-
-
-
diff --git a/pymic/net_run/self_sup/__init__.py b/pymic/net_run/self_sup/__init__.py
deleted file mode 100644
index 86482f9..0000000
--- a/pymic/net_run/self_sup/__init__.py
+++ /dev/null
@@ -1,16 +0,0 @@
-from __future__ import absolute_import
-from pymic.net_run.self_sup.self_genesis import SelfSupModelGenesis
-from pymic.net_run.self_sup.self_patch_swapping import SelfSupPatchSwapping
-# from pymic.net_run.self_sup.self_mim import SelfSupMIM
-# from pymic.net_run.self_sup.self_dino import SelfSupDINO
-from pymic.net_run.self_sup.self_vox2vec import SelfSupVox2Vec
-from pymic.net_run.self_sup.self_volf import SelfSupVolumeFusion
-
-SelfSupMethodDict = {
- # 'DINO': SelfSupDINO,
- 'Vox2Vec': SelfSupVox2Vec,
- 'ModelGenesis': SelfSupModelGenesis,
- 'PatchSwapping': SelfSupPatchSwapping,
- 'VolumeFusion': SelfSupVolumeFusion
- # 'MaskedImageModeling': SelfSupMIM
- }
\ No newline at end of file
diff --git a/pymic/net_run/self_sup/self_genesis.py b/pymic/net_run/self_sup/self_genesis.py
deleted file mode 100644
index 85ee194..0000000
--- a/pymic/net_run/self_sup/self_genesis.py
+++ /dev/null
@@ -1,51 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-import copy
-import logging
-import time
-from pymic.net_run.agent_rec import ReconstructionAgent
-
-class SelfSupModelGenesis(ReconstructionAgent):
- """
- Patch swapping-based self-supervised learning.
-
- Reference: Liang Chen et al., Self-supervised learning for medical image analysis
- using image context restoration, Medical Image Analysis, 2019.
-
- A PatchSwaping transform need to be used in the cnfiguration.
-
- .. note::
-
- In the configuration dictionary, in addition to the four sections (`dataset`,
- `network`, `training` and `inference`) used in fully supervised learning, an
- extra section `self_supervised_learning` is needed. See :doc:`usage.selfsl` for details.
-
- In the configuration file, it should look like this:
- ```
- [dataset]
- task_type = rec
- supervise_type = self_sup
- train_transform = [..., ..., PatchSwaping]
- valid_transform = [..., ..., PatchSwaping]
-
- [self_supervised_learning]
- method_name = ModelGenesis
-
- """
- def __init__(self, config, stage = 'train'):
- super(SelfSupModelGenesis, self).__init__(config, stage)
-
- def get_transform_names_and_parameters(self, stage):
- trans_names, trans_params = super(SelfSupModelGenesis, self).get_transform_names_and_parameters(stage)
- # if(stage == 'train'):
- # print('training transforms:', trans_names)
- # if("LocalShuffling" not in trans_names):
- # raise ValueError("LocalShuffling is required for model genesis, \
- # but it is not given in training transform")
- # if("NonLinearTransform" not in trans_names):
- # raise ValueError("NonLinearTransform is required for model genesis, \
- # but it is not given in training transform")
- # if("InOutPainting" not in trans_names):
- # raise ValueError("InOutPainting is required for model genesis, \
- # but it is not given in training transform")
- return trans_names, trans_params
diff --git a/pymic/net_run/self_sup/self_patch_swapping.py b/pymic/net_run/self_sup/self_patch_swapping.py
deleted file mode 100644
index 1692fa7..0000000
--- a/pymic/net_run/self_sup/self_patch_swapping.py
+++ /dev/null
@@ -1,44 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-import copy
-import logging
-import time
-from pymic.net_run.agent_rec import ReconstructionAgent
-
-class SelfSupPatchSwapping(ReconstructionAgent):
- """
- Patch swapping-based self-supervised learning.
-
- Reference: Liang Chen et al., Self-supervised learning for medical image analysis
- using image context restoration, Medical Image Analysis, 2019.
-
- A PatchSwaping transform need to be used in the cnfiguration.
-
- .. note::
-
- In the configuration dictionary, in addition to the four sections (`dataset`,
- `network`, `training` and `inference`) used in fully supervised learning, an
- extra section `self_supervised_learning` is needed. See :doc:`usage.selfsl` for details.
-
- In the configuration file, it should look like this:
- ```
- [dataset]
- task_type = rec
- supervise_type = self_sup
- train_transform = [..., ..., PatchSwaping]
- valid_transform = [..., ..., PatchSwaping]
-
- [self_supervised_learning]
- method_name = PatchSwapping
-
- """
- def __init__(self, config, stage = 'train'):
- super(SelfSupPatchSwapping, self).__init__(config, stage)
-
- def get_transform_names_and_parameters(self, stage):
- trans_names, trans_params = super(SelfSupPatchSwapping, self).get_transform_names_and_parameters(stage)
- if(stage == 'train'):
- print('training transforms:', trans_names)
- assert("PatchSwaping" in trans_names)
- return trans_names, trans_params
-
diff --git a/pymic/net_run/self_sup/self_sl_agent.py b/pymic/net_run/self_sup/self_sl_agent.py
deleted file mode 100644
index 45bee26..0000000
--- a/pymic/net_run/self_sup/self_sl_agent.py
+++ /dev/null
@@ -1,25 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-import copy
-import logging
-import time
-from pymic.net_run.agent_rec import ReconstructionAgent
-
-
-
-class SelfSLSegAgent(ReconstructionAgent):
- """
- Abstract class for self-supervised segmentation.
-
- :param config: (dict) A dictionary containing the configuration.
- :param stage: (str) One of the stage in `train` (default), `inference` or `test`.
-
- .. note::
-
- In the configuration dictionary, in addition to the four sections (`dataset`,
- `network`, `training` and `inference`) used in fully supervised learning, an
- extra section `self_supervised_learning` is needed. See :doc:`usage.selfsl` for details.
- """
- def __init__(self, config, stage = 'train'):
- super(SelfSLSegAgent, self).__init__(config, stage)
-
\ No newline at end of file
diff --git a/pymic/net_run/self_sup/self_volf.py b/pymic/net_run/self_sup/self_volf.py
deleted file mode 100644
index 4615979..0000000
--- a/pymic/net_run/self_sup/self_volf.py
+++ /dev/null
@@ -1,37 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-from pymic.net_run.agent_seg import SegmentationAgent
-
-
-class SelfSupVolumeFusion(SegmentationAgent):
- """
- Abstract class for self-supervised segmentation.
-
- :param config: (dict) A dictionary containing the configuration.
- :param stage: (str) One of the stage in `train` (default), `inference` or `test`.
-
- .. note::
-
- In the configuration dictionary, in addition to the four sections (`dataset`,
- `network`, `training` and `inference`) used in fully supervised learning, an
- extra section `semi_supervised_learning` is needed. See :doc:`usage.ssl` for details.
- """
- def __init__(self, config, stage = 'train'):
- super(SelfSupVolumeFusion, self).__init__(config, stage)
-
- def get_transform_names_and_parameters(self, stage):
- trans_names, trans_params = super(SelfSupVolumeFusion, self).get_transform_names_and_parameters(stage)
- if(stage == 'train'):
- print('training transforms:', trans_names)
- if("Crop4VolumeFusion" not in trans_names):
- raise ValueError("Crop4VolumeFusion is required for VolF, \
- but it is not given in training transform")
- if("VolumeFusion" not in trans_names):
- raise ValueError("VolumeFusion is required for VolF, \
- but it is not given in training transform")
- if("LabelToProbability" not in trans_names):
- raise ValueError("LabelToProbability is required for VolF, \
- but it is not given in training transform")
- return trans_names, trans_params
-
-
\ No newline at end of file
diff --git a/pymic/net_run/self_sup/self_vox2vec.py b/pymic/net_run/self_sup/self_vox2vec.py
deleted file mode 100644
index 94e2b16..0000000
--- a/pymic/net_run/self_sup/self_vox2vec.py
+++ /dev/null
@@ -1,304 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-import copy
-import logging
-import time
-import logging
-import torch
-import torch.nn as nn
-from datetime import datetime
-from torch.optim import lr_scheduler
-from tensorboardX import SummaryWriter
-from pymic.io.image_read_write import save_nd_array_as_image
-from pymic.net.net3d.fmunetv3 import FMUNetV3
-from pymic.net_run.agent_seg import SegmentationAgent
-from pymic.loss.cls.infoNCE import InfoNCELoss
-
-def select_from_pyramid(feature_pyramid, indices):
- """Select features from feature pyramid by their indices w.r.t. base feature map.
-
- Args:
- feature_pyramid (Sequence[torch.Tensor]): Sequence of tensors of shapes ``(B, C_i, D_i, H_i, W_i)``.
- indices (torch.Tensor): tensor of shape ``(B, N, 3)``
-
- Returns:
- torch.Tensor: tensor of shape ``(B, N, \sum_i c_i)``
- """
- out = []
- for i, x in enumerate(feature_pyramid):
- batch_size = list(x.shape)[0]
- x_move = x.moveaxis(1, -1)
- index_i = indices // 2 ** i
- x_i = [x_move[b][index_i[b][:, 0], index_i[b][:, 1], index_i[b][:, 2], :] for \
- b in range(batch_size)]
- x_i = torch.stack(x_i)
- out.append(x_i)
- out = torch.cat(out, dim = -1)
- return out
-
-class Vox2VecHead(nn.Module):
- def __init__(self, params):
- super(Vox2VecHead, self).__init__()
- ft_chns = params['feature_chns']
- hidden_dim = params['hidden_dim']
- proj_dim = params['project_dim']
- embed_dim = sum(ft_chns)
- self.proj_head = nn.Sequential(
- nn.Linear(embed_dim, hidden_dim),
- nn.BatchNorm1d(hidden_dim),
- nn.ReLU(),
- nn.Linear(hidden_dim, hidden_dim),
- nn.BatchNorm1d(hidden_dim),
- nn.ReLU(),
- nn.Linear(hidden_dim, proj_dim)
- )
-
- def forward(self, x):
- output = self.proj_head(x)
- output = nn.functional.normalize(output)
- return output
-
-class Vox2VecWrapper(nn.Module):
- """
- Perform forward pass separately on each resolution input.
- The inputs corresponding to a single resolution are clubbed and single
- forward is run on the same resolution inputs. Hence we do several
- forward passes = number of different resolutions used. We then
- concatenate all the output features and run the head forward on these
- concatenated features.
- """
- def __init__(self, backbone, head):
- super(Vox2VecWrapper, self).__init__()
- self.backbone = backbone
- self.head = head
-
- def forward(self, x, vex_idx):
- if(isinstance(self.backbone, FMUNetV3)):
- x = self.backbone.project(x)
- f = self.backbone.encoder(x)
- B = list(f[0].shape)[0]
- f_fpn = select_from_pyramid(f, vex_idx)
- feature_dim = list(f_fpn.shape)[-1]
- f_fpn = f_fpn.view(-1, feature_dim)
- output = self.head(f_fpn)
- proj_dim = list(output.shape)[-1]
- output = output.view(B, -1, proj_dim)
- return output
-
-class SelfSupVox2Vec(SegmentationAgent):
- """
- An agent for image self-supervised learning with DeSD.
- """
- def __init__(self, config, stage = 'train'):
- super(SelfSupVox2Vec, self).__init__(config, stage)
-
- def create_network(self):
- super(SelfSupVox2Vec, self).create_network()
- proj_dim = self.config['self_supervised_learning'].get('project_dim', 1024)
- hidden_dim = self.config['self_supervised_learning'].get('hidden_dim', 1024)
- head_params= {'feature_chns': self.config['network']['feature_chns'],
- 'hidden_dim':hidden_dim,
- 'project_dim':proj_dim}
- self.head = Vox2VecHead(head_params)
- self.net_wrapper = Vox2VecWrapper(self.net, self.head)
-
- def create_loss_calculator(self):
- # constrastive loss
- self_sup_params = self.config['self_supervised_learning']
- self.loss_calculator = InfoNCELoss(self_sup_params)
-
- def get_parameters_to_update(self):
- params = self.net_wrapper.parameters()
- return params
-
- def training(self):
- iter_valid = self.config['training']['iter_valid']
- train_loss = 0
- err_info = None
- data_time, gpu_time, loss_time, back_time = 0, 0, 0, 0
- self.net_wrapper.train()
- for it in range(iter_valid):
- t0 = time.time()
- try:
- data = next(self.trainIter)
- except StopIteration:
- self.trainIter = iter(self.train_loader)
- data = next(self.trainIter)
- t1 = time.time()
- patch1, patch2, vox_ids1, vox_ids2 = data['image']
- inputs = torch.cat([patch1, patch2], dim = 0)
- vox_ids = torch.cat([vox_ids1, vox_ids2], dim = 0)
- inputs = self.convert_tensor_type(inputs)
- inputs = inputs.to(self.device)
- vox_ids = vox_ids.to(self.device)
-
- # for debug
- # for i in range(patch1.shape[0]):
- # v1_i = patch1[i][0]
- # v2_i = patch2[i][0]
- # print("patch shape", v1_i.shape, v2_i.shape)
- # image_name0 = "temp/image_{0:}_{1:}_v0.nii.gz".format(it, i)
- # image_name1 = "temp/image_{0:}_{1:}_v1.nii.gz".format(it, i)
- # save_nd_array_as_image(v1_i, image_name0, reference_name = None)
- # save_nd_array_as_image(v2_i, image_name1, reference_name = None)
- # if(it > 10):
- # return
-
- # zero the parameter gradients
- self.optimizer.zero_grad()
-
- # forward + backward + optimize
- out = self.net_wrapper(inputs, vox_ids)
- out1, out2 = out.chunk(2)
-
- t2 = time.time()
- loss = self.loss_calculator(out1, out2)
- t3 = time.time()
-
- loss.backward()
- self.optimizer.step()
- train_loss = train_loss + loss.item()
- t4 = time.time()
-
- data_time = data_time + t1 - t0
- gpu_time = gpu_time + t2 - t1
- loss_time = loss_time + t3 - t2
- back_time = back_time + t4 - t3
-
- train_avg_loss = train_loss / iter_valid
- train_scalers = {'loss': train_avg_loss, 'data_time': data_time,
- 'gpu_time':gpu_time, 'loss_time':loss_time, 'back_time':back_time,
- 'err_info': err_info}
- return train_scalers
-
-
- def write_scalars(self, train_scalars, valid_scalars, lr_value, glob_it):
- loss_scalar ={'train':train_scalars['loss']}
- self.summ_writer.add_scalars('loss', loss_scalar, glob_it)
- self.summ_writer.add_scalars('lr', {"lr": lr_value}, glob_it)
- logging.info('train loss {0:.4f}'.format(train_scalars['loss']))
-
- def train_valid(self):
- device_ids = self.config['training']['gpus']
- if(len(device_ids) > 1):
- self.device = torch.device("cuda:0")
- self.net_wrapper = nn.DataParallel(self.net_wrapper, device_ids = device_ids)
- else:
- self.device = torch.device("cuda:{0:}".format(device_ids[0]))
- self.net_wrapper.to(self.device)
-
- ckpt_dir = self.config['training']['ckpt_dir']
- ckpt_prefix = self.config['training'].get('ckpt_prefix', None)
- if(ckpt_prefix is None):
- ckpt_prefix = ckpt_dir.split('/')[-1]
- # iter_start = self.config['training']['iter_start']
- iter_start = 0
- iter_max = self.config['training']['iter_max']
- iter_valid = self.config['training']['iter_valid']
- iter_save = self.config['training'].get('iter_save', None)
- early_stop_it = self.config['training'].get('early_stop_patience', None)
- if(iter_save is None):
- iter_save_list = [iter_max]
- elif(isinstance(iter_save, (tuple, list))):
- iter_save_list = iter_save
- else:
- iter_save_list = range(0, iter_max + 1, iter_save)
-
- self.min_loss = 10000.0
- self.min_loss_it = 0
- self.best_model_wts = None
- self.bett_head_wts = None
- checkpoint = None
- # initialize the network with pre-trained weights
- ckpt_init_name = self.config['training'].get('ckpt_init_name', None)
- ckpt_init_mode = self.config['training'].get('ckpt_init_mode', 0)
- ckpt_for_optm = None
- if(ckpt_init_name is not None):
- checkpoint = torch.load(ckpt_dir + "/" + ckpt_init_name, map_location = self.device)
- pretrained_dict = checkpoint['model_state_dict']
- pretrain_head_dict = checkpoint['head_state_dict']
- self.load_pretrained_weights(self.net, pretrained_dict, device_ids)
- self.load_pretrained_weights(self.head, pretrain_head_dict, device_ids)
-
- if(ckpt_init_mode > 0): # Load other information
- self.min_loss = checkpoint.get('train_loss', 10000)
- iter_start = checkpoint['iteration']
- self.min_loss_it = iter_start
- self.best_model_wts = checkpoint['model_state_dict']
- self.best_head_wts = checkpoint['head_state_dict']
- ckpt_for_optm = checkpoint
-
- self.create_optimizer(self.get_parameters_to_update(), ckpt_for_optm)
- self.create_loss_calculator()
-
- self.trainIter = iter(self.train_loader)
-
- logging.info("{0:} training start".format(str(datetime.now())[:-7]))
- self.summ_writer = SummaryWriter(self.config['training']['ckpt_dir'])
- self.glob_it = iter_start
- for it in range(iter_start, iter_max, iter_valid):
- lr_value = self.optimizer.param_groups[0]['lr']
-
- t0 = time.time()
- train_scalars = self.training()
- t1 = time.time()
- if(isinstance(self.scheduler, lr_scheduler.ReduceLROnPlateau)):
- self.scheduler.step(-train_scalars['loss'])
- else:
- self.scheduler.step()
-
- self.glob_it = it + iter_valid
- logging.info("\n{0:} it {1:}".format(str(datetime.now())[:-7], self.glob_it))
- logging.info('learning rate {0:}'.format(lr_value))
- logging.info("training time: {0:.2f}s".format(t1-t0))
- logging.info("data: {0:.2f}s, gpu: {1:.2f}s, loss: {2:.2f}s, back: {3:.2f}s".format(
- train_scalars['data_time'], train_scalars['gpu_time'],
- train_scalars['loss_time'], train_scalars['back_time']))
-
- self.write_scalars(train_scalars, None, lr_value, self.glob_it)
- if(train_scalars['loss'] < self.min_loss):
- self.min_loss = train_scalars['loss']
- self.min_loss_it = self.glob_it
- if(len(device_ids) > 1):
- self.best_model_wts = copy.deepcopy(self.net.module.state_dict())
- self.best_head_wts = copy.deepcopy(self.head.module.state_dict())
- else:
- self.best_model_wts = copy.deepcopy(self.net.state_dict())
- self.best_head_wts = copy.deepcopy(self.head.state_dict())
-
- save_dict = {'iteration': self.min_loss_it,
- 'train_loss': self.min_loss,
- 'model_state_dict': self.best_model_wts,
- 'head_state_dict': self.best_head_wts,
- 'optimizer_state_dict': self.optimizer.state_dict()}
- save_name = "{0:}/{1:}_best.pt".format(ckpt_dir, ckpt_prefix)
- torch.save(save_dict, save_name)
- txt_file = open("{0:}/{1:}_best.txt".format(ckpt_dir, ckpt_prefix), 'wt')
- txt_file.write(str(self.min_loss_it))
- txt_file.close()
-
- stop_now = True if(early_stop_it is not None and \
- self.glob_it - self.min_loss_it > early_stop_it) else False
- if(train_scalars['err_info'] is not None):
- logging.info("Early stopped due to error: {0:}".format(train_scalars['err_info']))
- stop_now = True
- if ((self.glob_it in iter_save_list) or stop_now):
- save_dict = {'iteration': self.glob_it,
- 'train_loss': train_scalars['loss'],
- 'model_state_dict': self.net.module.state_dict() \
- if len(device_ids) > 1 else self.net.state_dict(),
- 'head_state_dict': self.head.module.state_dict() \
- if len(device_ids) > 1 else self.head.state_dict(),
- 'optimizer_state_dict': self.optimizer.state_dict()}
- save_name = "{0:}/{1:}_{2:}.pt".format(ckpt_dir, ckpt_prefix, self.glob_it)
- torch.save(save_dict, save_name)
- txt_file = open("{0:}/{1:}_latest.txt".format(ckpt_dir, ckpt_prefix), 'wt')
- txt_file.write(str(self.glob_it))
- txt_file.close()
- if(stop_now):
- logging.info("The training is early stopped")
- break
- # save the best performing checkpoint
- logging.info('The best performing iter is {0:}, train loss {1:}'.format(\
- self.min_loss_it, self.min_loss))
- self.summ_writer.close()
\ No newline at end of file
diff --git a/pymic/net_run/self_sup/util.py b/pymic/net_run/self_sup/util.py
deleted file mode 100644
index d6adcc1..0000000
--- a/pymic/net_run/self_sup/util.py
+++ /dev/null
@@ -1,325 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-import os
-import copy
-import torch
-import random
-import numpy as np
-from scipy import ndimage
-from pymic.io.image_read_write import *
-from pymic.util.image_process import *
-
-
-def get_human_region_mask(img):
- """
- Get the mask of human region in CT volumes
- """
- dim = len(img.shape)
- if( dim == 4):
- img = img[0]
- mask = np.asarray(img > -600)
- se = np.ones([3,3,3])
- mask = ndimage.binary_opening(mask, se, iterations = 2)
- D, H, W = mask.shape
- for h in range(H):
- if(mask[:,h,:].sum() < 2000):
- mask[:,h, :] = np.zeros((D, W))
- mask = get_largest_k_components(mask, 1)
- mask_close = ndimage.binary_closing(mask, se, iterations = 2)
-
- D, H, W = mask.shape
- for d in [1, 2, D-3, D-2]:
- mask_close[d] = mask[d]
- for d in range(0, D, 2):
- mask_close[d, 2:-2, 2:-2] = np.ones((H-4, W-4))
-
- # get background component
- bg = np.zeros_like(mask)
- bgs = get_largest_k_components(1- mask_close, 10)
- for bgi in bgs:
- indices = np.where(bgi)
- if(bgi.sum() < 1000):
- break
- if(indices[0].min() == 0 or indices[1].min() == 0 or indices[2].min() ==0 or \
- indices[0].max() == D-1 or indices[1].max() == H-1 or indices[2].max() ==W-1):
- bg = bg + bgi
- fg = 1 - bg
-
- fg = ndimage.binary_opening(fg, se, iterations = 1)
- fg = get_largest_k_components(fg, 1)
- if(dim == 4):
- fg = np.expand_dims(fg, 0)
- fg = np.asarray(fg, np.uint8)
- return fg
-
-def get_human_region_mask_fast(img, itk_spacing):
- # downsample
- D, H, W = img.shape
- # scale_down = [1, 1, 1]
- if(itk_spacing[2] <= 1):
- scale_down = [1/2, 1/2, 1/2]
- else:
- scale_down = [1, 1/2, 1/2]
- img_sub = ndimage.interpolation.zoom(img, scale_down, order = 0)
- mask = get_human_region_mask(img_sub)
- D1, H1, W1 = mask.shape
- scale_up = [D/D1, H/H1, W/W1]
- mask = ndimage.interpolation.zoom(mask, scale_up, order = 0)
- return mask
-
-def crop_ct_scan(input_img, output_img, input_lab = None, output_lab = None, z_axis_density = 0.5):
- """
- Crop a CT scan based on the bounding box of the human region.
- """
- img_obj = sitk.ReadImage(input_img)
- img = sitk.GetArrayFromImage(img_obj)
- mask = np.asarray(img > -600)
- mask2d = np.mean(mask, axis = 0) > z_axis_density
- se = np.ones([3,3])
- mask2d = ndimage.binary_opening(mask2d, se, iterations = 2)
- mask2d = get_largest_k_components(mask2d, 1)
- bbmin, bbmax = get_ND_bounding_box(mask2d, margin = [0, 0])
- bbmin = [0] + bbmin
- bbmax = [img.shape[0]] + bbmax
- img_sub = crop_ND_volume_with_bounding_box(img, bbmin, bbmax)
- img_sub_obj = sitk.GetImageFromArray(img_sub)
- img_sub_obj.SetSpacing(img_obj.GetSpacing())
- img_sub_obj.SetDirection(img_obj.GetDirection())
- sitk.WriteImage(img_sub_obj, output_img)
- if(input_lab is not None):
- lab_obj = sitk.ReadImage(input_lab)
- lab = sitk.GetArrayFromImage(lab_obj)
- lab_sub = crop_ND_volume_with_bounding_box(lab, bbmin, bbmax)
- lab_sub_obj = sitk.GetImageFromArray(lab_sub)
- lab_sub_obj.SetSpacing(img_obj.GetSpacing())
- sitk.WriteImage(lab_sub_obj, output_lab)
-
-def get_human_body_mask_and_crop(input_dir, out_img_dir, out_mask_dir):
- if(not os.path.exists(out_img_dir)):
- os.mkdir(out_img_dir)
- os.mkdir(out_mask_dir)
-
- img_names = [item for item in os.listdir(input_dir) if "nii.gz" in item]
- img_names = sorted(img_names)
- for img_name in img_names:
- print(img_name)
- input_name = input_dir + "/" + img_name
- out_name = out_img_dir + "/" + img_name
- mask_name = out_mask_dir + "/" + img_name
- if(os.path.isfile(out_name)):
- continue
- img_obj = sitk.ReadImage(input_name)
- img = sitk.GetArrayFromImage(img_obj)
- spacing = img_obj.GetSpacing()
-
- # downsample
- D, H, W = img.shape
- spacing = img_obj.GetSpacing()
- # scale_down = [1, 1, 1]
- if(spacing[2] <= 1):
- scale_down = [1/2, 1/2, 1/2]
- else:
- scale_down = [1, 1/2, 1/2]
- img_sub = ndimage.interpolation.zoom(img, scale_down, order = 0)
- mask = get_human_region_mask(img_sub)
- D1, H1, W1 = mask.shape
- scale_up = [D/D1, H/H1, W/W1]
- mask = ndimage.interpolation.zoom(mask, scale_up, order = 0)
-
- bbmin, bbmax = get_ND_bounding_box(mask)
- img_crop = crop_ND_volume_with_bounding_box(img, bbmin, bbmax)
- mask_crop = crop_ND_volume_with_bounding_box(mask, bbmin, bbmax)
-
- out_img_obj = sitk.GetImageFromArray(img_crop)
- out_img_obj.SetSpacing(spacing)
- sitk.WriteImage(out_img_obj, out_name)
- mask_obj = sitk.GetImageFromArray(mask_crop)
- mask_obj.CopyInformation(out_img_obj)
- sitk.WriteImage(mask_obj, mask_name)
-
-def volume_fusion(x, fg_num, block_range, size_min, size_max):
- """
- Fuse a subregion of an impage with another one to generate
- images and labels for self-supervised segmentation.
- input x should be a batch of tensors
- """
- #n_min, n_max,
- N, C, D, H, W = list(x.shape)
- fg_mask = torch.zeros_like(x[:, :1, :, :, :]).to(torch.int32)
- # generate mask
- for n in range(N):
- p_num = random.randint(block_range[0], block_range[1])
- for i in range(p_num):
- d = random.randint(size_min[0], size_max[0])
- h = random.randint(size_min[1], size_max[1])
- w = random.randint(size_min[2], size_max[2])
- dc = random.randint(0, D - 1)
- hc = random.randint(0, H - 1)
- wc = random.randint(0, W - 1)
- d0 = dc - d // 2
- h0 = hc - h // 2
- w0 = wc - w // 2
- d1 = min(D, d0 + d)
- h1 = min(H, h0 + h)
- w1 = min(W, w0 + w)
- d0, h0, w0 = max(0, d0), max(0, h0), max(0, w0)
- temp_m = torch.ones([1, d1 - d0, h1 - h0, w1 - w0]) * random.randint(1, fg_num)
- fg_mask[n, :, d0:d1, h0:h1, w0:w1] = temp_m
- fg_w = fg_mask * 1.0 / fg_num
- x_roll = torch.roll(x, 1, 0)
- x_fuse = fg_w*x_roll + (1.0 - fg_w)*x
- # y_prob = get_one_hot_seg(fg_mask.to(torch.int32), fg_num + 1)
- return x_fuse, fg_mask
-
-def nonlinear_transform(x):
- v_min = torch.min(x)
- v_max = torch.max(x)
- x = (x - v_min)/(v_max - v_min)
- a = random.random() * 0.7 + 0.15
- b = random.random() * 0.7 + 0.15
- alpha = b / a
- beta = (1 - b) / (1 - a)
- if(alpha < 1.0 ):
- y = torch.maximum(alpha*x, beta*x + 1 - beta)
- else:
- y = torch.minimum(alpha*x, beta*x + 1 - beta)
- if(random.random() < 0.5):
- y = 1.0 - y
- y = y * (v_max - v_min) + v_min
- return y
-
-def nonlienar_volume_fusion(x, block_range, size_min, size_max):
- """
- Fuse a subregion of an impage with another one to generate
- images and labels for self-supervised segmentation.
- input x should be a batch of tensors
- """
- #n_min, n_max,
- N, C, D, H, W = list(x.shape)
- # apply nonlinear transform to x:
- x_nl1 = torch.zeros_like(x).to(torch.float32)
- x_nl2 = torch.zeros_like(x).to(torch.float32)
- for n in range(N):
- x_nl1[n] = nonlinear_transform(x[n])
- x_nl2[n] = nonlinear_transform(x[n])
- x_roll = torch.roll(x_nl2, 1, 0)
- mask = torch.zeros_like(x).to(torch.int32)
- p_num = random.randint(block_range[0], block_range[1])
- for n in range(N):
- for i in range(p_num):
- d = random.randint(size_min[0], size_max[0])
- h = random.randint(size_min[1], size_max[1])
- w = random.randint(size_min[2], size_max[2])
- dc = random.randint(0, D - 1)
- hc = random.randint(0, H - 1)
- wc = random.randint(0, W - 1)
- d0 = dc - d // 2
- h0 = hc - h // 2
- w0 = wc - w // 2
- d1 = min(D, d0 + d)
- h1 = min(H, h0 + h)
- w1 = min(W, w0 + w)
- d0, h0, w0 = max(0, d0), max(0, h0), max(0, w0)
- temp_m = torch.ones([C, d1 - d0, h1 - h0, w1 - w0])
- if(random.random() < 0.5):
- temp_m = temp_m * 2
- mask[n, :, d0:d1, h0:h1, w0:w1] = temp_m
-
- mask1 = (mask == 1).to(torch.int32)
- mask2 = (mask == 2).to(torch.int32)
- y = x_nl1 * (1.0 - mask1) + x_nl2 * mask1
- y = y * (1.0 - mask2) + x_roll * mask2
- return y, mask
-
-def augmented_volume_fusion(x, size_min, size_max):
- """
- Fuse a subregion of an impage with another one to generate
- images and labels for self-supervised segmentation.
- input x should be a batch of tensors
- """
- #n_min, n_max,
- N, C, D, H, W = list(x.shape)
- # apply nonlinear transform to x:
- x1 = torch.zeros_like(x).to(torch.float32)
- y = torch.zeros_like(x).to(torch.float32)
- mask = torch.zeros_like(x).to(torch.int32)
- for n in range(N):
- x1[n] = nonlinear_transform(x[n])
- y[n] = nonlinear_transform(x[n])
- x2 = torch.roll(x1, 1, 0)
-
- for n in range(N):
- block_size = [random.randint(size_min[i], size_max[i]) for i in range(3)]
- d_start = random.randint(0, block_size[0] // 2)
- h_start = random.randint(0, block_size[1] // 2)
- w_stat = random.randint(0, block_size[2] // 2)
- for d in range(d_start, D, block_size[0]):
- if(D - d < block_size[0] // 2):
- continue
- d1 = min(d + block_size[0], D)
- for h in range(h_start, H, block_size[1]):
- if(H - h < block_size[1] // 2):
- continue
- h1 = min(h + block_size[1], H)
- for w in range(w_stat, W, block_size[2]):
- if(W - w < block_size[2] // 2):
- continue
- w1 = min(w + block_size[2], W)
- p = random.random()
- if(p < 0.15): # nonlinear intensity augmentation
- mask[n, :, d:d1, h:h1, w:w1] = 1
- y[n, :, d:d1, h:h1, w:w1] = x1[n, :, d:d1, h:h1, w:w1]
- elif(p < 0.3): # random flip across a certain axis
- mask[n, :, d:d1, h:h1, w:w1] = 2
- flip_axis = random.randint(-3, -1)
- y[n, :, d:d1, h:h1, w:w1] = torch.flip(y[n, :, d:d1, h:h1, w:w1], (flip_axis,))
- elif(p < 0.45): # nonlinear intensity augmentation and random flip across a certain axis
- mask[n, :, d:d1, h:h1, w:w1] = 3
- flip_axis = random.randint(-3, -1)
- y[n, :, d:d1, h:h1, w:w1] = torch.flip(x1[n, :, d:d1, h:h1, w:w1], (flip_axis,))
- elif(p < 0.6): # paste from another volume
- mask[n, :, d:d1, h:h1, w:w1] = 4
- y[n, :, d:d1, h:h1, w:w1] = x2[n, :, d:d1, h:h1, w:w1]
- return y, mask
-
-def self_volume_fusion(x, fg_num, fuse_ratio, size_min, size_max):
- """
- Fuse a subregion of an impage with another one to generate
- images and labels for self-supervised segmentation.
- input x should be a batch of tensors
- """
- #n_min, n_max,
- N, C, D, H, W = list(x.shape)
- y = 1.0 * x
- fg_mask = torch.zeros_like(x[:, :1, :, :, :]).to(torch.int32)
-
- for n in range(N):
- db = random.randint(size_min[0], size_max[0])
- hb = random.randint(size_min[1], size_max[1])
- wb = random.randint(size_min[2], size_max[2])
- d0 = random.randint(0, D % db)
- h0 = random.randint(0, H % hb)
- w0 = random.randint(0, W % wb)
- coord_list_source = []
- for di in range(D // db):
- for hi in range(H // hb):
- for wi in range(W // wb):
- coord_list_source.append([di, hi, wi])
- coord_list_target = copy.deepcopy(coord_list_source)
- random.shuffle(coord_list_source)
- random.shuffle(coord_list_target)
- for i in range(int(len(coord_list_source)*fuse_ratio)):
- ds_l = d0 + db * coord_list_source[i][0]
- hs_l = h0 + hb * coord_list_source[i][1]
- ws_l = w0 + wb * coord_list_source[i][2]
- dt_l = d0 + db * coord_list_target[i][0]
- ht_l = h0 + hb * coord_list_target[i][1]
- wt_l = w0 + wb * coord_list_target[i][2]
- s_crop = x[n, :, ds_l:ds_l+db, hs_l:hs_l+hb, ws_l:ws_l+wb]
- t_crop = x[n, :, dt_l:dt_l+db, ht_l:ht_l+hb, wt_l:wt_l+wb]
- fg_m = random.randint(1, fg_num)
- fg_w = fg_m / (fg_num + 0.0)
- y[n, :, dt_l:dt_l+db, ht_l:ht_l+hb, wt_l:wt_l+wb] = t_crop * (1.0 - fg_w) + s_crop * fg_w
- fg_mask[n, 0, dt_l:dt_l+db, ht_l:ht_l+hb, wt_l:wt_l+wb] = \
- torch.ones([1, db, hb, wb]) * fg_m
- return y, fg_mask
\ No newline at end of file
diff --git a/pymic/net_run/semi_sup/__init__.py b/pymic/net_run/semi_sup/__init__.py
deleted file mode 100644
index 769a66b..0000000
--- a/pymic/net_run/semi_sup/__init__.py
+++ /dev/null
@@ -1,20 +0,0 @@
-from __future__ import absolute_import
-from pymic.net_run.semi_sup.ssl_abstract import SSLSegAgent
-from pymic.net_run.semi_sup.ssl_em import SSLEntropyMinimization
-from pymic.net_run.semi_sup.ssl_mt import SSLMeanTeacher
-from pymic.net_run.semi_sup.ssl_mcnet import SSLMCNet
-# from pymic.net_run.semi_sup.ssl_cdma import SSLCDMA
-from pymic.net_run.semi_sup.ssl_uamt import SSLUncertaintyAwareMeanTeacher
-from pymic.net_run.semi_sup.ssl_cct import SSLCCT
-from pymic.net_run.semi_sup.ssl_cps import SSLCPS
-from pymic.net_run.semi_sup.ssl_urpc import SSLURPC
-
-
-SSLMethodDict = {'EntropyMinimization': SSLEntropyMinimization,
- 'MeanTeacher': SSLMeanTeacher,
- 'MCNet': SSLMCNet,
- # 'CDMA': SSLCDMA,
- 'UAMT': SSLUncertaintyAwareMeanTeacher,
- 'CCT': SSLCCT,
- 'CPS': SSLCPS,
- 'URPC': SSLURPC}
\ No newline at end of file
diff --git a/pymic/net_run/semi_sup/ssl_abstract.py b/pymic/net_run/semi_sup/ssl_abstract.py
deleted file mode 100644
index 503c658..0000000
--- a/pymic/net_run/semi_sup/ssl_abstract.py
+++ /dev/null
@@ -1,114 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-import logging
-import numpy as np
-import random
-import torch
-import torchvision.transforms as transforms
-from pymic.io.nifty_dataset import NiftyDataset
-from pymic.loss.seg.util import get_soft_label
-from pymic.loss.seg.util import reshape_prediction_and_ground_truth
-from pymic.loss.seg.util import get_classwise_dice
-from pymic.loss.seg.ssl import EntropyLoss
-from pymic.net_run.agent_seg import SegmentationAgent
-from pymic.transform.trans_dict import TransformDict
-
-class SSLSegAgent(SegmentationAgent):
- """
- Abstract class for semi-supervised segmentation.
-
- :param config: (dict) A dictionary containing the configuration.
- :param stage: (str) One of the stage in `train` (default), `inference` or `test`.
-
- .. note::
-
- In the configuration dictionary, in addition to the four sections (`dataset`,
- `network`, `training` and `inference`) used in fully supervised learning, an
- extra section `semi_supervised_learning` is needed. See :doc:`usage.ssl` for details.
- """
- def __init__(self, config, stage = 'train'):
- super(SSLSegAgent, self).__init__(config, stage)
- self.transform_dict = TransformDict
- self.train_set_unlab = None
-
- def get_unlabeled_dataset_from_config(self):
- """
- Create a dataset for the unlabeled images based on configuration.
- """
- train_dir = self.config['dataset']['train_dir']
- modal_num = self.config['dataset'].get('modal_num', 1)
- transform_names = self.config['dataset']['train_transform_unlab']
-
- self.transform_list = []
- if(transform_names is None or len(transform_names) == 0):
- data_transform = None
- else:
- transform_param = self.config['dataset']
- transform_param['task'] = self.task_type
- for name in transform_names:
- if(name not in self.transform_dict):
- raise(ValueError("Undefined transform {0:}".format(name)))
- one_transform = self.transform_dict[name](transform_param)
- self.transform_list.append(one_transform)
- data_transform = transforms.Compose(self.transform_list)
-
- csv_file = self.config['dataset'].get('train_csv_unlab', None)
- stage_dim = self.config['dataset'].get('train_dim', 3)
- dataset = NiftyDataset(root_dir = train_dir,
- csv_file = csv_file,
- modal_num = modal_num,
- image_dim = stage_dim,
- allow_missing_modal = False,
- label_key = None,
- transform = data_transform,
- task = self.task_type)
- return dataset
-
- def create_dataset(self):
- super(SSLSegAgent, self).create_dataset()
- if(self.stage == 'train'):
- if(self.train_set_unlab is None):
- self.train_set_unlab = self.get_unlabeled_dataset_from_config()
- if(self.deterministic):
- def worker_init_fn(worker_id):
- random.seed(self.random_seed+worker_id)
- worker_init = worker_init_fn
- else:
- worker_init = None
-
- bn_train_unlab = self.config['dataset']['train_batch_size_unlab']
- num_worker = self.config['dataset'].get('num_worker', 16)
- self.train_loader_unlab = torch.utils.data.DataLoader(self.train_set_unlab,
- batch_size = bn_train_unlab, shuffle=True, num_workers= num_worker,
- worker_init_fn=worker_init, drop_last = True)
-
- def write_scalars(self, train_scalars, valid_scalars, lr_value, glob_it):
- loss_scalar ={'train':train_scalars['loss']}
- loss_sup_scalar = {'train':train_scalars['loss_sup'],
- 'valid':valid_scalars['loss']}
- loss_upsup_scalar = {'train':train_scalars['loss_reg']}
- dice_scalar ={'train':train_scalars['avg_fg_dice'], 'valid':valid_scalars['avg_fg_dice']}
- self.summ_writer.add_scalars('loss', loss_scalar, glob_it)
- self.summ_writer.add_scalars('loss_sup', loss_sup_scalar, glob_it)
- self.summ_writer.add_scalars('loss_reg', loss_upsup_scalar, glob_it)
- self.summ_writer.add_scalars('regular_w', {'regular_w':train_scalars['regular_w']}, glob_it)
- self.summ_writer.add_scalars('lr', {"lr": lr_value}, glob_it)
- self.summ_writer.add_scalars('dice', dice_scalar, glob_it)
- class_num = self.config['network']['class_num']
- for c in range(class_num):
- cls_dice_scalar = {'train':train_scalars['class_dice'][c], \
- 'valid':valid_scalars['class_dice'][c]}
- self.summ_writer.add_scalars('class_{0:}_dice'.format(c), cls_dice_scalar, glob_it)
- logging.info('train loss {0:.4f}, avg foreground dice {1:.4f} '.format(
- train_scalars['loss'], train_scalars['avg_fg_dice']) + "[" + \
- ' '.join("{0:.4f}".format(x) for x in train_scalars['class_dice']) + "]")
- logging.info('valid loss {0:.4f}, avg foreground dice {1:.4f} '.format(
- valid_scalars['loss'], valid_scalars['avg_fg_dice']) + "[" + \
- ' '.join("{0:.4f}".format(x) for x in valid_scalars['class_dice']) + "]")
- logging.info("data: {0:.2f}s, forward: {1:.2f}s, loss: {2:.2f}s, backward: {3:.2f}s".format(
- train_scalars['data_time'], train_scalars['forward_time'],
- train_scalars['loss_time'], train_scalars['backward_time']))
-
- def train_valid(self):
- self.trainIter_unlab = iter(self.train_loader_unlab)
- super(SSLSegAgent, self).train_valid()
diff --git a/pymic/net_run/semi_sup/ssl_cct.py b/pymic/net_run/semi_sup/ssl_cct.py
deleted file mode 100644
index 81723bd..0000000
--- a/pymic/net_run/semi_sup/ssl_cct.py
+++ /dev/null
@@ -1,172 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-import logging
-import time
-import torch
-import torch.nn as nn
-import torch.nn.functional as F
-import numpy as np
-from pymic.loss.seg.util import get_soft_label
-from pymic.loss.seg.util import reshape_prediction_and_ground_truth
-from pymic.loss.seg.util import get_classwise_dice
-from pymic.net_run.semi_sup import SSLSegAgent
-from pymic.util.ramps import get_rampup_ratio
-
-def softmax_mse_loss(inputs, targets, conf_mask=False, threshold=None, use_softmax=False):
- assert inputs.requires_grad == True and targets.requires_grad == False
- assert inputs.size() == targets.size() # (batch_size * num_classes * H * W)
- inputs = F.softmax(inputs, dim=1)
- if use_softmax:
- targets = F.softmax(targets, dim=1)
-
- if conf_mask:
- loss_mat = F.mse_loss(inputs, targets, reduction='none')
- mask = (targets.max(1)[0] > threshold)
- loss_mat = loss_mat[mask.unsqueeze(1).expand_as(loss_mat)]
- if loss_mat.shape.numel() == 0: loss_mat = torch.tensor([0.]).to(inputs.device)
- return loss_mat.mean()
- else:
- return F.mse_loss(inputs, targets, reduction='mean') # take the mean over the batch_size
-
-
-def softmax_kl_loss(inputs, targets, conf_mask=False, threshold=None, use_softmax=False):
- assert inputs.requires_grad == True and targets.requires_grad == False
- assert inputs.size() == targets.size()
- input_log_softmax = F.log_softmax(inputs, dim=1)
- if use_softmax:
- targets = F.softmax(targets, dim=1)
-
- if conf_mask:
- loss_mat = F.kl_div(input_log_softmax, targets, reduction='none')
- mask = (targets.max(1)[0] > threshold)
- loss_mat = loss_mat[mask.unsqueeze(1).expand_as(loss_mat)]
- if loss_mat.shape.numel() == 0: loss_mat = torch.tensor([0.]).to(inputs.device)
- return loss_mat.sum() / mask.shape.numel()
- else:
- return F.kl_div(input_log_softmax, targets, reduction='mean')
-
-
-def softmax_js_loss(inputs, targets, **_):
- assert inputs.requires_grad == True and targets.requires_grad == False
- assert inputs.size() == targets.size()
- epsilon = 1e-5
-
- M = (F.softmax(inputs, dim=1) + targets) * 0.5
- kl1 = F.kl_div(F.log_softmax(inputs, dim=1), M, reduction='mean')
- kl2 = F.kl_div(torch.log(targets+epsilon), M, reduction='mean')
- return (kl1 + kl2) * 0.5
-
-unsup_loss_dict = {"MSE": softmax_mse_loss,
- "KL":softmax_kl_loss,
- "JS":softmax_js_loss}
-
-class SSLCCT(SSLSegAgent):
- """
- Cross-Consistency Training for semi-supervised segmentation. It requires a network
- with multiple decoders for learning, such as `pymic.net.net2d.unet2d_cct.UNet2D_CCT`.
-
- * Reference: Yassine Ouali, Celine Hudelot and Myriam Tami:
- Semi-Supervised Semantic Segmentation With Cross-Consistency Training.
- `CVPR 2020. `_
-
- The Code is adapted from `Github `_
-
- :param config: (dict) A dictionary containing the configuration.
- :param stage: (str) One of the stage in `train` (default), `inference` or `test`.
-
- .. note::
-
- In the configuration dictionary, in addition to the four sections (`dataset`,
- `network`, `training` and `inference`) used in fully supervised learning, an
- extra section `semi_supervised_learning` is needed. See :doc:`usage.ssl` for details.
- """
- def training(self):
- class_num = self.config['network']['class_num']
- iter_valid = self.config['training']['iter_valid']
- ssl_cfg = self.config['semi_supervised_learning']
- iter_max = self.config['training']['iter_max']
- rampup_start = ssl_cfg.get('rampup_start', 0)
- rampup_end = ssl_cfg.get('rampup_end', iter_max)
- unsup_loss_name = ssl_cfg.get('unsupervised_loss', "MSE")
- self.unsup_loss_f = unsup_loss_dict[unsup_loss_name]
- train_loss, train_loss_sup, train_loss_reg = 0, 0, 0
- train_dice_list = []
- data_time, gpu_time, loss_time, back_time = 0, 0, 0, 0
- self.net.train()
-
- for it in range(iter_valid):
- t0 = time.time()
- try:
- data_lab = next(self.trainIter)
- except StopIteration:
- self.trainIter = iter(self.train_loader)
- data_lab = next(self.trainIter)
- try:
- data_unlab = next(self.trainIter_unlab)
- except StopIteration:
- self.trainIter_unlab = iter(self.train_loader_unlab)
- data_unlab = next(self.trainIter_unlab)
- t1 = time.time()
- # get the inputs
- x0 = self.convert_tensor_type(data_lab['image'])
- y0 = self.convert_tensor_type(data_lab['label_prob'])
- x1 = self.convert_tensor_type(data_unlab['image'])
- inputs = torch.cat([x0, x1], dim = 0)
- inputs, y0 = inputs.to(self.device), y0.to(self.device)
-
- # zero the parameter gradients
- self.optimizer.zero_grad()
-
- # forward pass
- output, aux_outputs = self.net(inputs)
- t2 = time.time()
- n0 = list(x0.shape)[0]
-
- # get supervised loss
- p0 = output[:n0]
- loss_sup = self.get_loss_value(data_lab, p0, y0)
-
- # get regularization loss
- p1 = F.softmax(output[n0:].detach(), dim=1)
- p1_aux = [aux_out[n0:] for aux_out in aux_outputs]
- loss_reg = 0.0
- for p1_auxi in p1_aux:
- loss_reg += self.unsup_loss_f( p1_auxi, p1, use_softmax = True)
- loss_reg = loss_reg / len(p1_aux)
-
- rampup_ratio = get_rampup_ratio(self.glob_it, rampup_start, rampup_end, "sigmoid")
- regular_w = ssl_cfg.get('regularize_w', 0.1) * rampup_ratio
- loss = loss_sup + regular_w*loss_reg
- t3 = time.time()
- loss.backward()
- t4 = time.time()
- self.optimizer.step()
-
- train_loss = train_loss + loss.item()
- train_loss_sup = train_loss_sup + loss_sup.item()
- train_loss_reg = train_loss_reg + loss_reg.item()
- # get dice evaluation for each class in annotated images
- if(isinstance(p0, tuple) or isinstance(p0, list)):
- p0 = p0[0]
- p0_argmax = torch.argmax(p0, dim = 1, keepdim = True)
- p0_soft = get_soft_label(p0_argmax, class_num, self.tensor_type)
- p0_soft, y0 = reshape_prediction_and_ground_truth(p0_soft, y0)
- dice_list = get_classwise_dice(p0_soft, y0)
- train_dice_list.append(dice_list.cpu().numpy())
-
- data_time = data_time + t1 - t0
- gpu_time = gpu_time + t2 - t1
- loss_time = loss_time + t3 - t2
- back_time = back_time + t4 - t3
- train_avg_loss = train_loss / iter_valid
- train_avg_loss_sup = train_loss_sup / iter_valid
- train_avg_loss_reg = train_loss_reg / iter_valid
- train_cls_dice = np.asarray(train_dice_list).mean(axis = 0)
- train_avg_dice = train_cls_dice[1:].mean()
-
- train_scalers = {'loss': train_avg_loss, 'loss_sup':train_avg_loss_sup,
- 'loss_reg':train_avg_loss_reg, 'regular_w':regular_w,
- 'avg_fg_dice':train_avg_dice, 'class_dice': train_cls_dice,
- 'data_time': data_time, 'forward_time':gpu_time,
- 'loss_time':loss_time, 'backward_time':back_time }
- return train_scalers
diff --git a/pymic/net_run/semi_sup/ssl_cps.py b/pymic/net_run/semi_sup/ssl_cps.py
deleted file mode 100644
index 66ce921..0000000
--- a/pymic/net_run/semi_sup/ssl_cps.py
+++ /dev/null
@@ -1,160 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-import logging
-import time
-import numpy as np
-import torch
-from random import random
-from pymic.loss.seg.util import get_soft_label
-from pymic.loss.seg.util import reshape_prediction_and_ground_truth
-from pymic.loss.seg.util import get_classwise_dice
-from pymic.io.image_read_write import save_nd_array_as_image
-from pymic.net_run.semi_sup import SSLSegAgent
-from pymic.util.ramps import get_rampup_ratio
-from pymic.util.general import mixup, tensor_shape_match
-
-class SSLCPS(SSLSegAgent):
- """
- Using cross pseudo supervision for semi-supervised segmentation.
-
- * Reference: Xiaokang Chen, Yuhui Yuan, Gang Zeng, Jingdong Wang,
- Semi-Supervised Semantic Segmentation with Cross Pseudo Supervision,
- `CVPR 2021 `_, pp. 2613-2022.
-
- :param config: (dict) A dictionary containing the configuration.
- :param stage: (str) One of the stage in `train` (default), `inference` or `test`.
-
- .. note::
-
- In the configuration dictionary, in addition to the four sections (`dataset`,
- `network`, `training` and `inference`) used in fully supervised learning, an
- extra section `semi_supervised_learning` is needed. See :doc:`usage.ssl` for details.
- """
- def __init__(self, config, stage = 'train'):
- super(SSLCPS, self).__init__(config, stage)
-
- def training(self):
- class_num = self.config['network']['class_num']
- iter_valid = self.config['training']['iter_valid']
- ssl_cfg = self.config['semi_supervised_learning']
- iter_max = self.config['training']['iter_max']
- mixup_prob = self.config['training'].get('mixup_probability', 0.0)
- rampup_start = ssl_cfg.get('rampup_start', 0)
- rampup_end = ssl_cfg.get('rampup_end', iter_max)
- train_loss = 0
- train_loss_sup1, train_loss_pseudo_sup1 = 0, 0
- train_loss_sup2, train_loss_pseudo_sup2 = 0, 0
- train_dice_list = []
- data_time, gpu_time, loss_time, back_time = 0, 0, 0, 0
- self.net.train()
- for it in range(iter_valid):
- t0 = time.time()
- try:
- data_lab = next(self.trainIter)
- except StopIteration:
- self.trainIter = iter(self.train_loader)
- data_lab = next(self.trainIter)
- try:
- data_unlab = next(self.trainIter_unlab)
- except StopIteration:
- self.trainIter_unlab = iter(self.train_loader_unlab)
- data_unlab = next(self.trainIter_unlab)
- t1 = time.time()
- # get the inputs
- x0 = self.convert_tensor_type(data_lab['image'])
- y0 = self.convert_tensor_type(data_lab['label_prob'])
- x1 = self.convert_tensor_type(data_unlab['image'])
-
- # for debug
- # for i in range(x0.shape[0]):
- # image_i = x0[i][0]
- # label_i = np.argmax(y0[i], axis = 0)
- # # pixw_i = pix_w[i][0]
- # print(image_i.shape, label_i.shape)
- # image_name = "temp/image_{0:}_{1:}.nii.gz".format(it, i)
- # label_name = "temp/label_{0:}_{1:}.nii.gz".format(it, i)
- # save_nd_array_as_image(image_i, image_name, reference_name = None)
- # save_nd_array_as_image(label_i, label_name, reference_name = None)
- # continue
- if(mixup_prob > 0 and random() < mixup_prob):
- x0, y0 = mixup(x0, y0)
- inputs = torch.cat([x0, x1], dim = 0)
- inputs, y0 = inputs.to(self.device), y0.to(self.device)
-
- # zero the parameter gradients
- self.optimizer.zero_grad()
-
- outputs1, outputs2 = self.net(inputs)
- outputs_soft1 = torch.softmax(outputs1, dim=1)
- outputs_soft2 = torch.softmax(outputs2, dim=1)
- t2 = time.time()
-
- n0 = list(x0.shape)[0]
- p0 = outputs_soft1[:n0]
- loss_sup1 = self.get_loss_value(data_lab, outputs1[:n0], y0)
- loss_sup2 = self.get_loss_value(data_lab, outputs2[:n0], y0)
-
- # Get pseudo labels of unannotated data and convert to one-hot
- pse_outputs1 = torch.argmax(outputs_soft1[n0:].detach(), dim=1, keepdim=True)
- pse_outputs2 = torch.argmax(outputs_soft2[n0:].detach(), dim=1, keepdim=True)
- pse_prob1 = get_soft_label(pse_outputs1, class_num, self.tensor_type)
- pse_prob2 = get_soft_label(pse_outputs2, class_num, self.tensor_type)
-
- pse_sup1 = self.get_loss_value(data_unlab, outputs1[n0:], pse_prob2)
- pse_sup2 = self.get_loss_value(data_unlab, outputs2[n0:], pse_prob1)
-
- rampup_ratio = get_rampup_ratio(self.glob_it, rampup_start, rampup_end, "sigmoid")
- regular_w = ssl_cfg.get('regularize_w', 0.1) * rampup_ratio
-
- model1_loss = loss_sup1 + regular_w * pse_sup1
- model2_loss = loss_sup2 + regular_w * pse_sup2
- loss = model1_loss + model2_loss
- t3 = time.time()
- loss.backward()
- t4 = time.time()
- self.optimizer.step()
-
- train_loss = train_loss + loss.item()
- train_loss_sup1 = train_loss_sup1 + loss_sup1.item()
- train_loss_sup2 = train_loss_sup2 + loss_sup2.item()
- train_loss_pseudo_sup1 = train_loss_pseudo_sup1 + pse_sup1.item()
- train_loss_pseudo_sup2 = train_loss_pseudo_sup2 + pse_sup2.item()
-
- # get dice evaluation for each class in annotated images
- if(isinstance(p0, tuple) or isinstance(p0, list)):
- p0 = p0[0]
- p0_argmax = torch.argmax(p0, dim = 1, keepdim = True)
- p0_soft = get_soft_label(p0_argmax, class_num, self.tensor_type)
- p0_soft, y0 = reshape_prediction_and_ground_truth(p0_soft, y0)
- dice_list = get_classwise_dice(p0_soft, y0)
- train_dice_list.append(dice_list.cpu().numpy())
-
- data_time = data_time + t1 - t0
- gpu_time = gpu_time + t2 - t1
- loss_time = loss_time + t3 - t2
- back_time = back_time + t4 - t3
- train_avg_loss = train_loss / iter_valid
- train_avg_loss_sup1 = train_loss_sup1 / iter_valid
- train_avg_loss_sup2 = train_loss_sup2 / iter_valid
- train_avg_loss_pse_sup1 = train_loss_pseudo_sup1 / iter_valid
- train_avg_loss_pse_sup2 = train_loss_pseudo_sup2 / iter_valid
- train_cls_dice = np.asarray(train_dice_list).mean(axis = 0)
- train_avg_dice = train_cls_dice[1:].mean()
-
- train_scalers = {'loss': train_avg_loss,
- 'loss_sup1':train_avg_loss_sup1, 'loss_sup2': train_avg_loss_sup2,
- 'loss_pse_sup1':train_avg_loss_pse_sup1, 'loss_pse_sup2': train_avg_loss_pse_sup2,
- 'regular_w':regular_w, 'avg_fg_dice':train_avg_dice, 'class_dice': train_cls_dice,
- 'data_time': data_time, 'forward_time':gpu_time,
- 'loss_time':loss_time, 'backward_time':back_time }
- return train_scalers
-
- def write_scalars(self, train_scalars, valid_scalars, lr_value, glob_it):
- super(SSLCPS, self).write_scalars(train_scalars, valid_scalars, lr_value, glob_it)
- loss_sup_scalar = {'train_net1':train_scalars['loss_sup1'],
- 'train_net2':train_scalars['loss_sup2'],
- 'valid':valid_scalars['loss']}
- loss_pse_sup_scalar = {'train_net1':train_scalars['loss_pse_sup1'],
- 'train_net2':train_scalars['loss_pse_sup2']}
- self.summ_writer.add_scalars('loss_sup', loss_sup_scalar, glob_it)
- self.summ_writer.add_scalars('loss_pseudo_sup', loss_pse_sup_scalar, glob_it)
\ No newline at end of file
diff --git a/pymic/net_run/semi_sup/ssl_em.py b/pymic/net_run/semi_sup/ssl_em.py
deleted file mode 100644
index 750e3d3..0000000
--- a/pymic/net_run/semi_sup/ssl_em.py
+++ /dev/null
@@ -1,118 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-import logging
-import numpy as np
-import time
-import torch
-from pymic.loss.seg.util import get_soft_label
-from pymic.loss.seg.util import reshape_prediction_and_ground_truth
-from pymic.loss.seg.util import get_classwise_dice
-from pymic.loss.seg.ssl import EntropyLoss
-from pymic.net_run.semi_sup import SSLSegAgent
-from pymic.transform.trans_dict import TransformDict
-from pymic.util.ramps import get_rampup_ratio
-
-class SSLEntropyMinimization(SSLSegAgent):
- """
- Using Entropy Minimization for semi-supervised segmentation.
-
- * Reference: Yves Grandvalet and Yoshua Bengio:
- Semi-supervised Learningby Entropy Minimization.
- `NeurIPS, 2005. `_
-
- :param config: (dict) A dictionary containing the configuration.
- :param stage: (str) One of the stage in `train` (default), `inference` or `test`.
-
- .. note::
-
- In the configuration dictionary, in addition to the four sections (`dataset`,
- `network`, `training` and `inference`) used in fully supervised learning, an
- extra section `semi_supervised_learning` is needed. See :doc:`usage.ssl` for details.
- """
- def __init__(self, config, stage = 'train'):
- super(SSLEntropyMinimization, self).__init__(config, stage)
- self.transform_dict = TransformDict
- self.train_set_unlab = None
-
- def training(self):
- class_num = self.config['network']['class_num']
- iter_valid = self.config['training']['iter_valid']
- ssl_cfg = self.config['semi_supervised_learning']
- iter_max = self.config['training']['iter_max']
- rampup_start = ssl_cfg.get('rampup_start', 0)
- rampup_end = ssl_cfg.get('rampup_end', iter_max)
- train_loss, train_loss_sup, train_loss_reg = 0, 0, 0
- train_dice_list = []
- data_time, gpu_time, loss_time, back_time = 0, 0, 0, 0
- self.net.train()
- for it in range(iter_valid):
- t0 = time.time()
- try:
- data_lab = next(self.trainIter)
- except StopIteration:
- self.trainIter = iter(self.train_loader)
- data_lab = next(self.trainIter)
- try:
- data_unlab = next(self.trainIter_unlab)
- except StopIteration:
- self.trainIter_unlab = iter(self.train_loader_unlab)
- data_unlab = next(self.trainIter_unlab)
- t1 = time.time()
- # get the inputs
- x0 = self.convert_tensor_type(data_lab['image'])
- y0 = self.convert_tensor_type(data_lab['label_prob'])
- x1 = self.convert_tensor_type(data_unlab['image'])
- inputs = torch.cat([x0, x1], dim = 0)
- inputs, y0 = inputs.to(self.device), y0.to(self.device)
-
- # zero the parameter gradients
- self.optimizer.zero_grad()
-
- # forward + backward + optimize
- outputs = self.net(inputs)
- t2 = time.time()
-
- n0 = list(x0.shape)[0]
- p0 = outputs[:n0]
- loss_sup = self.get_loss_value(data_lab, p0, y0)
- loss_dict = {"prediction":outputs, 'softmax':True}
- loss_reg = EntropyLoss()(loss_dict)
-
- rampup_ratio = get_rampup_ratio(self.glob_it, rampup_start, rampup_end, "sigmoid")
- regular_w = ssl_cfg.get('regularize_w', 0.1) * rampup_ratio
-
- loss = loss_sup + regular_w*loss_reg
- t3 = time.time()
-
- loss.backward()
- t4 = time.time()
- self.optimizer.step()
-
- train_loss = train_loss + loss.item()
- train_loss_sup = train_loss_sup + loss_sup.item()
- train_loss_reg = train_loss_reg + loss_reg.item()
- # get dice evaluation for each class in annotated images
- if(isinstance(p0, tuple) or isinstance(p0, list)):
- p0 = p0[0]
- p0_argmax = torch.argmax(p0, dim = 1, keepdim = True)
- p0_soft = get_soft_label(p0_argmax, class_num, self.tensor_type)
- p0_soft, y0 = reshape_prediction_and_ground_truth(p0_soft, y0)
- dice_list = get_classwise_dice(p0_soft, y0)
- train_dice_list.append(dice_list.cpu().numpy())
-
- data_time = data_time + t1 - t0
- gpu_time = gpu_time + t2 - t1
- loss_time = loss_time + t3 - t2
- back_time = back_time + t4 - t3
- train_avg_loss = train_loss / iter_valid
- train_avg_loss_sup = train_loss_sup / iter_valid
- train_avg_loss_reg = train_loss_reg / iter_valid
- train_cls_dice = np.asarray(train_dice_list).mean(axis = 0)
- train_avg_dice = train_cls_dice[1:].mean()
-
- train_scalers = {'loss': train_avg_loss, 'loss_sup':train_avg_loss_sup,
- 'loss_reg':train_avg_loss_reg, 'regular_w':regular_w,
- 'avg_fg_dice':train_avg_dice, 'class_dice': train_cls_dice,
- 'data_time': data_time, 'forward_time':gpu_time,
- 'loss_time':loss_time, 'backward_time':back_time }
- return train_scalers
\ No newline at end of file
diff --git a/pymic/net_run/semi_sup/ssl_mcnet.py b/pymic/net_run/semi_sup/ssl_mcnet.py
deleted file mode 100644
index d374773..0000000
--- a/pymic/net_run/semi_sup/ssl_mcnet.py
+++ /dev/null
@@ -1,139 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-import logging
-import time
-import torch
-import torch.nn as nn
-import torch.nn.functional as F
-import numpy as np
-from pymic.loss.seg.util import get_soft_label
-from pymic.loss.seg.util import reshape_prediction_and_ground_truth
-from pymic.loss.seg.util import get_classwise_dice
-from pymic.net_run.semi_sup import SSLSegAgent
-from pymic.util.ramps import get_rampup_ratio
-
-def sharpening(P, T = 0.1):
- T = 1.0/T
- P_sharpen = P**T / (P**T + (1-P)**T)
- return P_sharpen
-
-class SSLMCNet(SSLSegAgent):
- """
- Mutual Consistency Learning for semi-supervised segmentation. It requires a network
- with multiple decoders for learning, such as `pymic.net.net2d.unet2d_mcnet.MCNet2D`.
-
- * Reference: Yicheng Wu, Zongyuan Ge et al. Mutual consistency learning for
- semi-supervised medical image segmentation.
- `MIA 2022. `_
-
- The original code is at: https://github.com/ycwu1997/MC-Net
-
- :param config: (dict) A dictionary containing the configuration.
- :param stage: (str) One of the stage in `train` (default), `inference` or `test`.
-
- .. note::
- In the configuration dictionary, in addition to the four sections (`dataset`,
- `network`, `training` and `inference`) used in fully supervised learning, an
- extra section `semi_supervised_learning` is needed. See :doc:`usage.ssl` for details.
- """
- def training(self):
- class_num = self.config['network']['class_num']
- iter_valid = self.config['training']['iter_valid']
- ssl_cfg = self.config['semi_supervised_learning']
- iter_max = self.config['training']['iter_max']
- rampup_start = ssl_cfg.get('rampup_start', 0)
- rampup_end = ssl_cfg.get('rampup_end', iter_max)
- temperature = ssl_cfg.get('temperature', 0.1)
- unsup_loss_name = ssl_cfg.get('unsupervised_loss', "MSE")
- train_loss, train_loss_sup, train_loss_reg = 0, 0, 0
- train_dice_list = []
- data_time, gpu_time, loss_time, back_time = 0, 0, 0, 0
- self.net.train()
-
- for it in range(iter_valid):
- t0 = time.time()
- try:
- data_lab = next(self.trainIter)
- except StopIteration:
- self.trainIter = iter(self.train_loader)
- data_lab = next(self.trainIter)
- try:
- data_unlab = next(self.trainIter_unlab)
- except StopIteration:
- self.trainIter_unlab = iter(self.train_loader_unlab)
- data_unlab = next(self.trainIter_unlab)
- t1 = time.time()
- # get the inputs
- x0 = self.convert_tensor_type(data_lab['image'])
- y0 = self.convert_tensor_type(data_lab['label_prob'])
- x1 = self.convert_tensor_type(data_unlab['image'])
- inputs = torch.cat([x0, x1], dim = 0)
- inputs, y0 = inputs.to(self.device), y0.to(self.device)
-
- # zero the parameter gradients
- self.optimizer.zero_grad()
-
- # forward pass to obtain multiple predictions
- outputs = self.net(inputs)
- t2 = time.time()
- num_outputs = len(outputs)
- n0 = list(x0.shape)[0]
- p0 = F.softmax(outputs[0], dim=1)[:n0]
- # for probability prediction and pseudo respectively
- p_ori = torch.zeros((num_outputs,) + outputs[0].shape)
- y_psu = torch.zeros((num_outputs,) + outputs[0].shape)
-
- # get supervised loss
- loss_sup = 0
- for idx in range(num_outputs):
- p0i = outputs[idx][:n0]
- loss_sup += self.get_loss_value(data_lab, p0i, y0)
-
- # get pseudo labels
- p_i = F.softmax(outputs[idx], dim=1)
- p_ori[idx] = p_i
- y_psu[idx] = sharpening(p_i, temperature)
-
- # get regularization loss
- loss_reg = 0.0
- for i in range(num_outputs):
- for j in range(num_outputs):
- if (i!=j):
- loss_reg += F.mse_loss(p_ori[i], y_psu[j], reduction='mean')
-
- rampup_ratio = get_rampup_ratio(self.glob_it, rampup_start, rampup_end, "sigmoid")
- regular_w = ssl_cfg.get('regularize_w', 0.1) * rampup_ratio
- loss = loss_sup + regular_w*loss_reg
- t3 = time.time()
- loss.backward()
- t4 = time.time()
- self.optimizer.step()
-
- train_loss = train_loss + loss.item()
- train_loss_sup = train_loss_sup + loss_sup.item()
- train_loss_reg = train_loss_reg + loss_reg.item()
- # get dice evaluation for each class in annotated images
- if(isinstance(p0, tuple) or isinstance(p0, list)):
- p0 = p0[0]
- p0_argmax = torch.argmax(p0, dim = 1, keepdim = True)
- p0_soft = get_soft_label(p0_argmax, class_num, self.tensor_type)
- p0_soft, y0 = reshape_prediction_and_ground_truth(p0_soft, y0)
- dice_list = get_classwise_dice(p0_soft, y0)
- train_dice_list.append(dice_list.cpu().numpy())
-
- data_time = data_time + t1 - t0
- gpu_time = gpu_time + t2 - t1
- loss_time = loss_time + t3 - t2
- back_time = back_time + t4 - t3
- train_avg_loss = train_loss / iter_valid
- train_avg_loss_sup = train_loss_sup / iter_valid
- train_avg_loss_reg = train_loss_reg / iter_valid
- train_cls_dice = np.asarray(train_dice_list).mean(axis = 0)
- train_avg_dice = train_cls_dice[1:].mean()
-
- train_scalers = {'loss': train_avg_loss, 'loss_sup':train_avg_loss_sup,
- 'loss_reg':train_avg_loss_reg, 'regular_w':regular_w,
- 'avg_fg_dice':train_avg_dice, 'class_dice': train_cls_dice,
- 'data_time': data_time, 'forward_time':gpu_time,
- 'loss_time':loss_time, 'backward_time':back_time }
- return train_scalers
diff --git a/pymic/net_run/semi_sup/ssl_mt.py b/pymic/net_run/semi_sup/ssl_mt.py
deleted file mode 100644
index 303eeff..0000000
--- a/pymic/net_run/semi_sup/ssl_mt.py
+++ /dev/null
@@ -1,142 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-import logging
-import time
-import torch
-import numpy as np
-from pymic.loss.seg.util import get_soft_label
-from pymic.loss.seg.util import reshape_prediction_and_ground_truth
-from pymic.loss.seg.util import get_classwise_dice
-from pymic.net_run.semi_sup import SSLSegAgent
-from pymic.net.net_dict_seg import SegNetDict
-from pymic.util.ramps import get_rampup_ratio
-
-class SSLMeanTeacher(SSLSegAgent):
- """
- Mean Teacher for semi-supervised segmentation.
-
- * Reference: Antti Tarvainen, Harri Valpola: Mean teachers are better role models:
- Weight-averaged consistency targets improve semi-supervised deep learning results.
- `NeurIPS 2017. `_
-
- :param config: (dict) A dictionary containing the configuration.
- :param stage: (str) One of the stage in `train` (default), `inference` or `test`.
-
- .. note::
-
- In the configuration dictionary, in addition to the four sections (`dataset`,
- `network`, `training` and `inference`) used in fully supervised learning, an
- extra section `semi_supervised_learning` is needed. See :doc:`usage.ssl` for details.
- """
- def __init__(self, config, stage = 'train'):
- super(SSLMeanTeacher, self).__init__(config, stage)
- self.net_ema = None
-
- def create_network(self):
- super(SSLMeanTeacher, self).create_network()
- if(self.net_ema is None):
- net_name = self.config['network']['net_type']
- if(net_name not in SegNetDict):
- raise ValueError("Undefined network {0:}".format(net_name))
- self.net_ema = SegNetDict[net_name](self.config['network'])
- if(self.tensor_type == 'float'):
- self.net_ema.float()
- else:
- self.net_ema.double()
-
- def training(self):
- class_num = self.config['network']['class_num']
- iter_valid = self.config['training']['iter_valid']
- ssl_cfg = self.config['semi_supervised_learning']
- iter_max = self.config['training']['iter_max']
- rampup_start = ssl_cfg.get('rampup_start', 0)
- rampup_end = ssl_cfg.get('rampup_end', iter_max)
- train_loss, train_loss_sup, train_loss_reg = 0, 0, 0
- train_dice_list = []
- data_time, gpu_time, loss_time, back_time = 0, 0, 0, 0
- self.net.train()
- self.net_ema.to(self.device)
- for it in range(iter_valid):
- t0 = time.time()
- try:
- data_lab = next(self.trainIter)
- except StopIteration:
- self.trainIter = iter(self.train_loader)
- data_lab = next(self.trainIter)
- try:
- data_unlab = next(self.trainIter_unlab)
- except StopIteration:
- self.trainIter_unlab = iter(self.train_loader_unlab)
- data_unlab = next(self.trainIter_unlab)
- t1 = time.time()
- # get the inputs
- x0 = self.convert_tensor_type(data_lab['image'])
- y0 = self.convert_tensor_type(data_lab['label_prob'])
- x1 = self.convert_tensor_type(data_unlab['image'])
- inputs = torch.cat([x0, x1], dim = 0)
- inputs, y0 = inputs.to(self.device), y0.to(self.device)
- noise = torch.clamp(torch.randn_like(x1) * 0.1, -0.2, 0.2)
- inputs_ema = x1 + torch.clamp(torch.randn_like(x1) * 0.1, -0.2, 0.2)
- inputs_ema = inputs_ema.to(self.device)
-
- # zero the parameter gradients
- self.optimizer.zero_grad()
-
- outputs = self.net(inputs)
- t2 = time.time()
-
- n0 = list(x0.shape)[0]
- p0 = outputs[:n0]
- loss_sup = self.get_loss_value(data_lab, p0, y0)
-
- outputs_soft = torch.softmax(outputs, dim=1)
- p1_soft = outputs_soft[n0:]
-
- with torch.no_grad():
- outputs_ema = self.net_ema(inputs_ema)
- p1_ema_soft = torch.softmax(outputs_ema, dim=1)
-
- rampup_ratio = get_rampup_ratio(self.glob_it, rampup_start, rampup_end, "sigmoid")
- regular_w = ssl_cfg.get('regularize_w', 0.1) * rampup_ratio
-
- loss_reg = torch.nn.MSELoss()(p1_soft, p1_ema_soft)
- loss = loss_sup + regular_w*loss_reg
- t3 = time.time()
- loss.backward()
- t4 = time.time()
- self.optimizer.step()
-
- # update EMA
- alpha = ssl_cfg.get('ema_decay', 0.99)
- alpha = min(1 - 1 / (self.glob_it / iter_valid + 1), alpha)
- for ema_param, param in zip(self.net_ema.parameters(), self.net.parameters()):
- ema_param.data.mul_(alpha).add(param.data, alpha = 1.0 - alpha)
-
- train_loss = train_loss + loss.item()
- train_loss_sup = train_loss_sup + loss_sup.item()
- train_loss_reg = train_loss_reg + loss_reg.item()
- # get dice evaluation for each class in annotated images
- if(isinstance(p0, tuple) or isinstance(p0, list)):
- p0 = p0[0]
- p0_argmax = torch.argmax(p0, dim = 1, keepdim = True)
- p0_soft = get_soft_label(p0_argmax, class_num, self.tensor_type)
- p0_soft, y0 = reshape_prediction_and_ground_truth(p0_soft, y0)
- dice_list = get_classwise_dice(p0_soft, y0)
- train_dice_list.append(dice_list.cpu().numpy())
-
- data_time = data_time + t1 - t0
- gpu_time = gpu_time + t2 - t1
- loss_time = loss_time + t3 - t2
- back_time = back_time + t4 - t3
- train_avg_loss = train_loss / iter_valid
- train_avg_loss_sup = train_loss_sup / iter_valid
- train_avg_loss_reg = train_loss_reg / iter_valid
- train_cls_dice = np.asarray(train_dice_list).mean(axis = 0)
- train_avg_dice = train_cls_dice[1:].mean()
-
- train_scalers = {'loss': train_avg_loss, 'loss_sup':train_avg_loss_sup,
- 'loss_reg':train_avg_loss_reg, 'regular_w':regular_w,
- 'avg_fg_dice':train_avg_dice, 'class_dice': train_cls_dice,
- 'data_time': data_time, 'forward_time':gpu_time,
- 'loss_time':loss_time, 'backward_time':back_time}
- return train_scalers
\ No newline at end of file
diff --git a/pymic/net_run/semi_sup/ssl_uamt.py b/pymic/net_run/semi_sup/ssl_uamt.py
deleted file mode 100644
index 5888a8b..0000000
--- a/pymic/net_run/semi_sup/ssl_uamt.py
+++ /dev/null
@@ -1,143 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-import logging
-import time
-import torch
-import numpy as np
-from pymic.loss.seg.util import get_soft_label
-from pymic.loss.seg.util import reshape_prediction_and_ground_truth
-from pymic.loss.seg.util import get_classwise_dice
-from pymic.net_run.semi_sup import SSLMeanTeacher
-from pymic.util.ramps import get_rampup_ratio
-
-class SSLUncertaintyAwareMeanTeacher(SSLMeanTeacher):
- """
- Uncertainty Aware Mean Teacher for semi-supervised segmentation.
-
- * Reference: Lequan Yu, Shujun Wang, Xiaomeng Li, Chi-Wing Fu, and Pheng-Ann Heng.
- Uncertainty-aware Self-ensembling Model for Semi-supervised 3D Left Atrium
- Segmentation, `MICCAI 2019. `_
-
- :param config: (dict) A dictionary containing the configuration.
- :param stage: (str) One of the stage in `train` (default), `inference` or `test`.
-
- .. note::
-
- In the configuration dictionary, in addition to the four sections (`dataset`,
- `network`, `training` and `inference`) used in fully supervised learning, an
- extra section `semi_supervised_learning` is needed. See :doc:`usage.ssl` for details.
- """
- def training(self):
- class_num = self.config['network']['class_num']
- iter_valid = self.config['training']['iter_valid']
- ssl_cfg = self.config['semi_supervised_learning']
- iter_max = self.config['training']['iter_max']
- rampup_start = ssl_cfg.get('rampup_start', 0)
- rampup_end = ssl_cfg.get('rampup_end', iter_max)
- train_loss, train_loss_sup, train_loss_reg = 0, 0, 0
- train_dice_list = []
- data_time, gpu_time, loss_time, back_time = 0, 0, 0, 0
- self.net.train()
- self.net_ema.to(self.device)
- for it in range(iter_valid):
- t0 = time.time()
- try:
- data_lab = next(self.trainIter)
- except StopIteration:
- self.trainIter = iter(self.train_loader)
- data_lab = next(self.trainIter)
- try:
- data_unlab = next(self.trainIter_unlab)
- except StopIteration:
- self.trainIter_unlab = iter(self.train_loader_unlab)
- data_unlab = next(self.trainIter_unlab)
- t1 = time.time()
- # get the inputs
- x0 = self.convert_tensor_type(data_lab['image'])
- y0 = self.convert_tensor_type(data_lab['label_prob'])
- x1 = self.convert_tensor_type(data_unlab['image'])
- inputs = torch.cat([x0, x1], dim = 0)
- inputs, y0 = inputs.to(self.device), y0.to(self.device)
- inputs_ema = x1 + torch.clamp(torch.randn_like(x1) * 0.1, -0.2, 0.2)
- inputs_ema = inputs_ema.to(self.device)
-
- # zero the parameter gradients
- self.optimizer.zero_grad()
-
- outputs = self.net(inputs)
- t2 = time.time()
- n0 = list(x0.shape)[0]
- p0, p1 = torch.tensor_split(outputs, [n0,], dim = 0)
- outputs_soft = torch.softmax(outputs, dim=1)
- p0_soft, p1_soft = torch.tensor_split(outputs_soft, [n0,], dim = 0)
- loss_sup = self.get_loss_value(data_lab, p0, y0)
-
- with torch.no_grad():
- outputs_ema = self.net_ema(inputs_ema)
- p1_ema_soft = torch.softmax(outputs_ema, dim=1)
- square_error = torch.square(p1_soft - p1_ema_soft)
-
- # the forward pass number for uncertainty estimation
- T = ssl_cfg.get("uamt_mcdroput_n", 8)
- preds = torch.zeros([T] + list(p1.shape)).to(self.device)
- for i in range(T//2):
- ema_inputs_r = torch.cat([x1, x1], dim = 0)
- ema_inputs_r = ema_inputs_r + \
- torch.clamp(torch.randn_like(ema_inputs_r) * 0.1, -0.2, 0.2)
- ema_inputs_r = ema_inputs_r.to(self.device)
- with torch.no_grad():
- ema_outputs_r = self.net_ema(ema_inputs_r)
- # reshape from [2B, C, D, H, W] to [2, B, C, D, H, W]
- preds[2*i:2*(i+1)] = ema_outputs_r.reshape([2]+list(p1.shape))
- preds = torch.softmax(preds, dim = 2)
- preds = torch.mean(preds, dim = 0)
- uncertainty = -1.0 * torch.sum(preds*torch.log(preds + 1e-6),
- dim=1, keepdim=True)
-
- rampup_ratio = get_rampup_ratio(self.glob_it, rampup_start, rampup_end, "sigmoid")
- class_num = list(y0.shape)[1]
- threshold = (0.75+0.25*rampup_ratio)*np.log(class_num)
- mask = (uncertainty < threshold).float()
- loss_reg = torch.sum(mask*square_error)/(2*torch.sum(mask)+1e-16)
-
- regular_w = ssl_cfg.get('regularize_w', 0.1) * rampup_ratio
- loss = loss_sup + regular_w*loss_reg
- t3 = time.time()
- loss.backward()
- t4 = time.time()
- self.optimizer.step()
-
- # update EMA
- alpha = ssl_cfg.get('ema_decay', 0.99)
- alpha = min(1 - 1 / (self.glob_it / iter_valid + 1), alpha)
- for ema_param, param in zip(self.net_ema.parameters(), self.net.parameters()):
- ema_param.data.mul_(alpha).add(param.data, alpha = 1.0 - alpha)
-
- train_loss = train_loss + loss.item()
- train_loss_sup = train_loss_sup + loss_sup.item()
- train_loss_reg = train_loss_reg + loss_reg.item()
- # get dice evaluation for each class in annotated images
- if(isinstance(p0, tuple) or isinstance(p0, list)):
- p0 = p0[0]
- p0_argmax = torch.argmax(p0, dim = 1, keepdim = True)
- p0_soft = get_soft_label(p0_argmax, class_num, self.tensor_type)
- p0_soft, y0 = reshape_prediction_and_ground_truth(p0_soft, y0)
- dice_list = get_classwise_dice(p0_soft, y0)
- train_dice_list.append(dice_list.cpu().numpy())
-
- data_time = data_time + t1 - t0
- gpu_time = gpu_time + t2 - t1
- loss_time = loss_time + t3 - t2
- back_time = back_time + t4 - t3
- train_avg_loss = train_loss / iter_valid
- train_avg_loss_sup = train_loss_sup / iter_valid
- train_avg_loss_reg = train_loss_reg / iter_valid
- train_cls_dice = np.asarray(train_dice_list).mean(axis = 0)
- train_avg_dice = train_cls_dice[1:].mean()
-
- train_scalers = {'loss': train_avg_loss, 'loss_sup':train_avg_loss_sup,
- 'loss_reg':train_avg_loss_reg, 'regular_w':regular_w,
- 'avg_fg_dice':train_avg_dice, 'class_dice': train_cls_dice,
- 'data_time': data_time, 'forward_time':gpu_time,
- 'loss_time':loss_time, 'backward_time':back_time }
- return train_scalers
\ No newline at end of file
diff --git a/pymic/net_run/semi_sup/ssl_urpc.py b/pymic/net_run/semi_sup/ssl_urpc.py
deleted file mode 100644
index 8447709..0000000
--- a/pymic/net_run/semi_sup/ssl_urpc.py
+++ /dev/null
@@ -1,132 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-import logging
-import time
-import torch
-import torch.nn as nn
-import numpy as np
-from pymic.loss.seg.util import get_soft_label
-from pymic.loss.seg.util import reshape_prediction_and_ground_truth
-from pymic.loss.seg.util import get_classwise_dice
-from pymic.net_run.semi_sup import SSLSegAgent
-from pymic.util.ramps import get_rampup_ratio
-
-class SSLURPC(SSLSegAgent):
- """
- Uncertainty-Rectified Pyramid Consistency for semi-supervised segmentation.
-
- * Reference: Xiangde Luo, Guotai Wang*, Wenjun Liao, Jieneng Chen, Tao Song, Yinan Chen,
- Shichuan Zhang, Dimitris N. Metaxas, Shaoting Zhang.
- Semi-Supervised Medical Image Segmentation via Uncertainty Rectified Pyramid Consistency .
- `Medical Image Analysis 2022. `_
-
- :param config: (dict) A dictionary containing the configuration.
- :param stage: (str) One of the stage in `train` (default), `inference` or `test`.
-
- .. note::
-
- In the configuration dictionary, in addition to the four sections (`dataset`,
- `network`, `training` and `inference`) used in fully supervised learning, an
- extra section `semi_supervised_learning` is needed. See :doc:`usage.ssl` for details.
- """
- def training(self):
- class_num = self.config['network']['class_num']
- iter_valid = self.config['training']['iter_valid']
- ssl_cfg = self.config['semi_supervised_learning']
- iter_max = self.config['training']['iter_max']
- rampup_start = ssl_cfg.get('rampup_start', 0)
- rampup_end = ssl_cfg.get('rampup_end', iter_max)
- train_loss, train_loss_sup, train_loss_reg = 0, 0, 0
- train_dice_list = []
- data_time, gpu_time, loss_time, back_time = 0, 0, 0, 0
- self.net.train()
- kl_distance = nn.KLDivLoss(reduction='none')
- for it in range(iter_valid):
- t0 = time.time()
- try:
- data_lab = next(self.trainIter)
- except StopIteration:
- self.trainIter = iter(self.train_loader)
- data_lab = next(self.trainIter)
- try:
- data_unlab = next(self.trainIter_unlab)
- except StopIteration:
- self.trainIter_unlab = iter(self.train_loader_unlab)
- data_unlab = next(self.trainIter_unlab)
- t1 = time.time()
- # get the inputs
- x0 = self.convert_tensor_type(data_lab['image'])
- y0 = self.convert_tensor_type(data_lab['label_prob'])
- x1 = self.convert_tensor_type(data_unlab['image'])
- inputs = torch.cat([x0, x1], dim = 0)
- inputs, y0 = inputs.to(self.device), y0.to(self.device)
-
- # zero the parameter gradients
- self.optimizer.zero_grad()
-
- # forward pass
- outputs_list = self.net(inputs)
- t2 = time.time()
- n0 = list(x0.shape)[0]
-
- # get supervised loss
- p0 = [output_i[:n0] for output_i in outputs_list]
- loss_sup = self.get_loss_value(data_lab, p0, y0)
-
- # resize to the same shape, and get average probability across scales
- outputs_soft_list = [torch.softmax(item, dim=1) for item in outputs_list]
- for i in range(1, len(outputs_soft_list)):
- outputs_soft_list[i] = nn.functional.interpolate(outputs_soft_list[i],
- outputs_soft_list[0].shape[2:])
- outputs_soft_avg = torch.mean(torch.stack(outputs_soft_list),dim = 0)
- p1_avg = outputs_soft_avg[n0:] * 0.99 + 0.005 # for unannotated images
-
- # regularization loss
- loss_reg = 0.0
- for soft_i in outputs_soft_list:
- p1_i = soft_i[n0:] * 0.99 + 0.005
- var = torch.sum(kl_distance(
- torch.log(p1_i), p1_avg), dim=1, keepdim=True)
- exp_var = torch.exp(-var)
- square_e= torch.square(p1_avg - p1_i)
- loss_i = torch.mean(square_e * exp_var) / \
- (torch.mean(exp_var) + 1e-8) + torch.mean(var)
- loss_reg += loss_i
- loss_reg = loss_reg / len(outputs_list)
-
- rampup_ratio = get_rampup_ratio(self.glob_it, rampup_start, rampup_end, "sigmoid")
- regular_w = ssl_cfg.get('regularize_w', 0.1) * rampup_ratio
- loss = loss_sup + regular_w*loss_reg
- t3 = time.time()
- loss.backward()
- t4 = time.time()
- self.optimizer.step()
-
- train_loss = train_loss + loss.item()
- train_loss_sup = train_loss_sup + loss_sup.item()
- train_loss_reg = train_loss_reg + loss_reg.item()
- # get dice evaluation for each class in annotated images
- if(isinstance(p0, tuple) or isinstance(p0, list)):
- p0 = p0[0]
- p0_argmax = torch.argmax(p0, dim = 1, keepdim = True)
- p0_soft = get_soft_label(p0_argmax, class_num, self.tensor_type)
- p0_soft, y0 = reshape_prediction_and_ground_truth(p0_soft, y0)
- dice_list = get_classwise_dice(p0_soft, y0)
- train_dice_list.append(dice_list.cpu().numpy())
-
- data_time = data_time + t1 - t0
- gpu_time = gpu_time + t2 - t1
- loss_time = loss_time + t3 - t2
- back_time = back_time + t4 - t3
- train_avg_loss = train_loss / iter_valid
- train_avg_loss_sup = train_loss_sup / iter_valid
- train_avg_loss_reg = train_loss_reg / iter_valid
- train_cls_dice = np.asarray(train_dice_list).mean(axis = 0)
- train_avg_dice = train_cls_dice[1:].mean()
-
- train_scalers = {'loss': train_avg_loss, 'loss_sup':train_avg_loss_sup,
- 'loss_reg':train_avg_loss_reg, 'regular_w':regular_w,
- 'avg_fg_dice':train_avg_dice, 'class_dice': train_cls_dice,
- 'data_time': data_time, 'forward_time':gpu_time,
- 'loss_time':loss_time, 'backward_time':back_time}
- return train_scalers
diff --git a/pymic/net_run/train.py b/pymic/net_run/train.py
deleted file mode 100644
index cdc3a3c..0000000
--- a/pymic/net_run/train.py
+++ /dev/null
@@ -1,99 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-import argparse
-import logging
-import os
-import sys
-import shutil
-from datetime import datetime
-from pymic import TaskType
-from pymic.util.parse_config import *
-from pymic.net_run.agent_cls import ClassificationAgent
-from pymic.net_run.agent_seg import SegmentationAgent
-from pymic.net_run.agent_rec import ReconstructionAgent
-from pymic.net_run.semi_sup import SSLMethodDict
-from pymic.net_run.weak_sup import WSLMethodDict
-from pymic.net_run.self_sup import SelfSupMethodDict
-from pymic.net_run.noisy_label import NLLMethodDict
-
-def get_seg_rec_agent(config, sup_type):
- assert(sup_type in ['fully_sup', 'semi_sup', 'self_sup', 'weak_sup', 'noisy_label'])
- if(sup_type == 'fully_sup'):
- logging.info("\n********** Fully Supervised Learning **********\n")
- if config['dataset']['task_type'] == TaskType.SEGMENTATION:
- agent = SegmentationAgent(config, 'train')
- else:
- agent = ReconstructionAgent(config, 'train')
- elif(sup_type == 'semi_sup'):
- logging.info("\n********** Semi Supervised Learning **********\n")
- method = config['semi_supervised_learning']['method_name']
- agent = SSLMethodDict[method](config, 'train')
- elif(sup_type == 'weak_sup'):
- logging.info("\n********** Weakly Supervised Learning **********\n")
- method = config['weakly_supervised_learning']['method_name']
- agent = WSLMethodDict[method](config, 'train')
- elif(sup_type == 'noisy_label'):
- logging.info("\n********** Noisy Label Learning **********\n")
- method = config['noisy_label_learning']['method_name']
- agent = NLLMethodDict[method](config, 'train')
- elif(sup_type == 'self_sup'):
- logging.info("\n********** Self Supervised Learning **********\n")
- method = config['self_supervised_learning']['method_name']
- agent = SelfSupMethodDict[method](config, 'train')
- else:
- raise ValueError("undefined supervision type: {0:}".format(sup_type))
- return agent
-
-def main():
- """
- The main function for running a network for training.
- """
- if(len(sys.argv) < 2):
- print('Number of arguments should be at least 2. e.g.')
- print(' pymic_train config.cfg --train_csv train.csv')
- exit()
- parser = argparse.ArgumentParser()
- parser.add_argument("cfg", help="configuration file for training")
- parser.add_argument("--train_csv", help="the csv file for training images",
- required=False, default=None)
- parser.add_argument("--valid_csv", help="the csv file for validation images",
- required=False, default=None)
- parser.add_argument("--ckpt_dir", help="the output dir for trained model",
- required=False, default=None)
- parser.add_argument("--iter_max", help="the maximal iteration number for training",
- required=False, default=None)
- parser.add_argument("--gpus", help="the gpus for runing, e.g., [0]",
- required=False, default=None)
- args = parser.parse_args()
- if(not os.path.isfile(args.cfg)):
- raise ValueError("The config file does not exist: " + args.cfg)
- config = parse_config(args)
- config = synchronize_config(config)
-
- log_dir = config['training']['ckpt_dir']
- if(not os.path.exists(log_dir)):
- os.makedirs(log_dir, exist_ok=True)
- datetime_str = str(datetime.now())[:-7].replace(":", "_")
- if sys.version.startswith("3.9"):
- logging.basicConfig(filename=log_dir+"/log_train_{0:}.txt".format(datetime_str),
- level=logging.INFO, format='%(message)s', force=True) # for python 3.9
- else:
- logging.basicConfig(filename=log_dir+"/log_train_{0:}.txt".format(datetime_str),
- level=logging.INFO, format='%(message)s') # for python 3.6
- logging.getLogger().addHandler(logging.StreamHandler(sys.stdout))
- dst_cfg = args.cfg if "/" not in args.cfg else args.cfg.split("/")[-1]
- wrtie_config(config, log_dir + "/" + dst_cfg)
-
- task = config['dataset']['task_type']
- if(task == TaskType.CLASSIFICATION_ONE_HOT or task == TaskType.CLASSIFICATION_COEXIST):
- agent = ClassificationAgent(config, 'train')
- else:
- sup_type = config['dataset'].get('supervise_type', 'fully_sup')
- agent = get_seg_rec_agent(config, sup_type)
-
- agent.run()
-
-if __name__ == "__main__":
- main()
-
-
diff --git a/pymic/net_run/weak_sup/__init__.py b/pymic/net_run/weak_sup/__init__.py
deleted file mode 100644
index 3586d25..0000000
--- a/pymic/net_run/weak_sup/__init__.py
+++ /dev/null
@@ -1,19 +0,0 @@
-from __future__ import absolute_import
-from pymic.net_run.weak_sup.wsl_abstract import WSLSegAgent
-from pymic.net_run.weak_sup.wsl_em import WSLEntropyMinimization
-from pymic.net_run.weak_sup.wsl_gatedcrf import WSLGatedCRF
-from pymic.net_run.weak_sup.wsl_mumford_shah import WSLMumfordShah
-from pymic.net_run.weak_sup.wsl_tv import WSLTotalVariation
-from pymic.net_run.weak_sup.wsl_ustm import WSLUSTM
-from pymic.net_run.weak_sup.wsl_dmpls import WSLDMPLS
-from pymic.net_run.weak_sup.wsl_dmsps import WSLDMSPS
-from pymic.net_run.weak_sup.wsl_psseg import WSLPSSEG
-
-WSLMethodDict = {'EntropyMinimization': WSLEntropyMinimization,
- 'GatedCRF': WSLGatedCRF,
- 'MumfordShah': WSLMumfordShah,
- 'TotalVariation': WSLTotalVariation,
- 'USTM': WSLUSTM,
- 'DMPLS': WSLDMPLS,
- 'DMSPS': WSLDMSPS,
- 'PSSeg': WSLPSSEG}
\ No newline at end of file
diff --git a/pymic/net_run/weak_sup/wsl_abstract.py b/pymic/net_run/weak_sup/wsl_abstract.py
deleted file mode 100644
index 8c691ee..0000000
--- a/pymic/net_run/weak_sup/wsl_abstract.py
+++ /dev/null
@@ -1,42 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-import logging
-from pymic.net_run.agent_seg import SegmentationAgent
-
-class WSLSegAgent(SegmentationAgent):
- """
- Abstract agent for weakly supervised segmentation.
-
- :param config: (dict) A dictionary containing the configuration.
- :param stage: (str) One of the stage in `train` (default), `inference` or `test`.
-
- .. note::
-
- In the configuration dictionary, in addition to the four sections (`dataset`,
- `network`, `training` and `inference`) used in fully supervised learning, an
- extra section `weakly_supervised_learning` is needed. See :doc:`usage.wsl` for details.
- """
- def __init__(self, config, stage = 'train'):
- super(WSLSegAgent, self).__init__(config, stage)
-
- def write_scalars(self, train_scalars, valid_scalars, lr_value, glob_it):
- loss_train_scalar = {'train':train_scalars['loss']}
- loss_sup_scalar = {'train':train_scalars['loss_sup'],
- 'valid':valid_scalars['loss']}
- dice_scalar = {'valid':valid_scalars['avg_fg_dice']}
- self.summ_writer.add_scalars('loss_train', loss_train_scalar, glob_it)
- self.summ_writer.add_scalars('loss_sup', loss_sup_scalar, glob_it)
-
- self.summ_writer.add_scalars('lr', {"lr": lr_value}, glob_it)
- self.summ_writer.add_scalars('dice', dice_scalar, glob_it)
- class_num = self.config['network']['class_num']
- for c in range(class_num):
- cls_dice_scalar = {'valid':valid_scalars['class_dice'][c]}
- self.summ_writer.add_scalars('class_{0:}_dice'.format(c), cls_dice_scalar, glob_it)
- logging.info('train loss {0:.4f}'.format(train_scalars['loss']))
- logging.info('valid loss {0:.4f}, avg foreground dice {1:.4f} '.format(
- valid_scalars['loss'], valid_scalars['avg_fg_dice']) + "[" + \
- ' '.join("{0:.4f}".format(x) for x in valid_scalars['class_dice']) + "]")
- logging.info("data: {0:.2f}s, forward: {1:.2f}s, loss: {2:.2f}s, backward: {3:.2f}s".format(
- train_scalars['data_time'], train_scalars['forward_time'],
- train_scalars['loss_time'], train_scalars['backward_time']))
diff --git a/pymic/net_run/weak_sup/wsl_dmpls.py b/pymic/net_run/weak_sup/wsl_dmpls.py
deleted file mode 100644
index a0100be..0000000
--- a/pymic/net_run/weak_sup/wsl_dmpls.py
+++ /dev/null
@@ -1,131 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-import logging
-import numpy as np
-import random
-import time
-import torch
-from pymic.loss.seg.util import get_soft_label
-from pymic.loss.seg.dice import DiceLoss
-from pymic.loss.seg.ce import CrossEntropyLoss
-from pymic.net_run.weak_sup import WSLSegAgent
-from pymic.util.ramps import get_rampup_ratio
-
-class WSLDMPLS(WSLSegAgent):
- """
- Weakly supervised segmentation based on Dynamically Mixed Pseudo Labels Supervision.
-
- * Reference: Xiangde Luo, Minhao Hu, Wenjun Liao, Shuwei Zhai, Tao Song, Guotai Wang,
- Shaoting Zhang. ScribblScribble-Supervised Medical Image Segmentation via
- Dual-Branch Network and Dynamically Mixed Pseudo Labels Supervision.
- `MICCAI 2022. `_
-
- :param config: (dict) A dictionary containing the configuration.
- :param stage: (str) One of the stage in `train` (default), `inference` or `test`.
-
- .. note::
-
- In the configuration dictionary, in addition to the four sections (`dataset`,
- `network`, `training` and `inference`) used in fully supervised learning, an
- extra section `weakly_supervised_learning` is needed. See :doc:`usage.wsl` for details.
- """
- def __init__(self, config, stage = 'train'):
- super(WSLDMPLS, self).__init__(config, stage)
-
- def create_network(self):
- if(self.net is None):
- net_name = self.config['network']['net_type']
- if net_name is not 'DBNet':
- logging.warn("By defualt, the DBNet is used by DMPLS/DMSPS. " +
- "Using your customized network {0:} should be careful.".format(net_name))
- if(net_name not in self.net_dict):
- raise ValueError("Undefined network {0:}".format(net_name))
- self.net = self.net_dict[net_name](self.config['network'])
- super(WSLDMPLS, self).create_network()
-
- def training(self):
- class_num = self.config['network']['class_num']
- iter_valid = self.config['training']['iter_valid']
- wsl_cfg = self.config['weakly_supervised_learning']
- iter_max = self.config['training']['iter_max']
- rampup_start = wsl_cfg.get('rampup_start', 0)
- rampup_end = wsl_cfg.get('rampup_end', iter_max)
- pseudo_loss_type = wsl_cfg.get('pseudo_sup_loss', 'dice_loss')
- if (pseudo_loss_type not in ('dice_loss', 'ce_loss')):
- raise ValueError("""For pseudo supervision loss, only dice_loss and ce_loss \
- are supported.""")
- train_loss, train_loss_sup, train_loss_reg = 0, 0, 0
- data_time, gpu_time, loss_time, back_time = 0, 0, 0, 0
-
- self.net.train()
- for it in range(iter_valid):
- t0 = time.time()
- try:
- data = next(self.trainIter)
- except StopIteration:
- self.trainIter = iter(self.train_loader)
- data = next(self.trainIter)
- t1 = time.time()
- # get the inputs
- inputs = self.convert_tensor_type(data['image'])
- y = self.convert_tensor_type(data['label_prob'])
-
- inputs, y = inputs.to(self.device), y.to(self.device)
-
- # zero the parameter gradients
- self.optimizer.zero_grad()
-
- # forward + backward + optimize
- outputs1, outputs2 = self.net(inputs)
- t2 = time.time()
-
- loss_sup1 = self.get_loss_value(data, outputs1, y)
- loss_sup2 = self.get_loss_value(data, outputs2, y)
- loss_sup = 0.5 * (loss_sup1 + loss_sup2)
-
- # get pseudo label with dynamical mix
- outputs_soft1 = torch.softmax(outputs1, dim=1)
- outputs_soft2 = torch.softmax(outputs2, dim=1)
- beta = random.random()
- pseudo_lab = beta*outputs_soft1.detach() + (1.0-beta)*outputs_soft2.detach()
- pseudo_lab = torch.argmax(pseudo_lab, dim = 1, keepdim = True)
- pseudo_lab = get_soft_label(pseudo_lab, class_num, self.tensor_type)
-
- # calculate the pseudo label supervision loss
- loss_calculator = DiceLoss() if pseudo_loss_type == 'dice_loss' else CrossEntropyLoss()
- loss_dict1 = {"prediction":outputs1, 'ground_truth':pseudo_lab}
- loss_dict2 = {"prediction":outputs2, 'ground_truth':pseudo_lab}
- loss_reg = 0.5 * (loss_calculator(loss_dict1) + loss_calculator(loss_dict2))
-
- rampup_ratio = get_rampup_ratio(self.glob_it, rampup_start, rampup_end, "sigmoid")
- regular_w = wsl_cfg.get('regularize_w', 0.1) * rampup_ratio
- loss = loss_sup + regular_w*loss_reg
- t3 = time.time()
- loss.backward()
- t4 = time.time()
- self.optimizer.step()
-
- train_loss = train_loss + loss.item()
- train_loss_sup = train_loss_sup + loss_sup.item()
- train_loss_reg = train_loss_reg + loss_reg.item()
-
- data_time = data_time + t1 - t0
- gpu_time = gpu_time + t2 - t1
- loss_time = loss_time + t3 - t2
- back_time = back_time + t4 - t3
- train_avg_loss = train_loss / iter_valid
- train_avg_loss_sup = train_loss_sup / iter_valid
- train_avg_loss_reg = train_loss_reg / iter_valid
-
- train_scalers = {'loss': train_avg_loss, 'loss_sup':train_avg_loss_sup,
- 'loss_reg':train_avg_loss_reg, 'regular_w':regular_w,
- 'data_time': data_time, 'forward_time':gpu_time,
- 'loss_time':loss_time, 'backward_time':back_time}
- return train_scalers
-
- def write_scalars(self, train_scalars, valid_scalars, lr_value, glob_it):
- loss_reg_scalar = {'train':train_scalars['loss_reg']}
- weight_scalar = {'regular_w':train_scalars['regular_w']}
- self.summ_writer.add_scalars('loss_reg', loss_reg_scalar, glob_it)
- self.summ_writer.add_scalars('weight', weight_scalar, glob_it)
- super(WSLDMPLS, self).write_scalars(train_scalars, valid_scalars, lr_value, glob_it)
\ No newline at end of file
diff --git a/pymic/net_run/weak_sup/wsl_dmsps.py b/pymic/net_run/weak_sup/wsl_dmsps.py
deleted file mode 100644
index d7ffcf9..0000000
--- a/pymic/net_run/weak_sup/wsl_dmsps.py
+++ /dev/null
@@ -1,174 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-import logging
-import os
-import numpy as np
-import random
-import time
-import torch
-import scipy
-from pymic.io.image_read_write import save_nd_array_as_image
-from pymic.loss.seg.dice import DiceLoss
-from pymic.loss.seg.ce import CrossEntropyLoss
-from pymic.net_run.weak_sup import WSLDMPLS
-from pymic.util.ramps import get_rampup_ratio
-
-class WSLDMSPS(WSLDMPLS):
- """
- Weakly supervised segmentation based on Dynamically Mixed Pseudo Labels Supervision.
-
- * Reference: Meng Han, Xiangde Luo, Xiangjiang Xie, Wenjun Liao, Shichuan Zhang, Tao Song,
- Guotai Wang, Shaoting Zhang. DMSPS: Dynamically mixed soft pseudo-label supervision for
- scribble-supervised medical image segmentation.
- `Medical Image Analysis 2024. `_
-
- :param config: (dict) A dictionary containing the configuration.
- :param stage: (str) One of the stage in `train` (default), `inference` or `test`.
-
- .. note::
-
- In the configuration dictionary, in addition to the four sections (`dataset`,
- `network`, `training` and `inference`) used in fully supervised learning, an
- extra section `weakly_supervised_learning` is needed. See :doc:`usage.wsl` for details.
- """
- def __init__(self, config, stage = 'train'):
- super(WSLDMSPS, self).__init__(config, stage)
-
- def training(self):
- class_num = self.config['network']['class_num']
- iter_valid = self.config['training']['iter_valid']
- wsl_cfg = self.config['weakly_supervised_learning']
- iter_max = self.config['training']['iter_max']
- rampup_start = wsl_cfg.get('rampup_start', 0)
- rampup_end = wsl_cfg.get('rampup_end', iter_max)
- pseudo_loss_type = wsl_cfg.get('pseudo_sup_loss', 'ce_loss')
- if (pseudo_loss_type not in ('dice_loss', 'ce_loss')):
- raise ValueError("""For pseudo supervision loss, only dice_loss and ce_loss \
- are supported.""")
- pseudo_loss_func = CrossEntropyLoss() if pseudo_loss_type == 'ce_loss' else DiceLoss()
- train_loss, train_loss_sup, train_loss_reg = 0, 0, 0
- data_time, gpu_time, loss_time, back_time = 0, 0, 0, 0
-
- self.net.train()
- for it in range(iter_valid):
- t0 = time.time()
- try:
- data = next(self.trainIter)
- except StopIteration:
- self.trainIter = iter(self.train_loader)
- data = next(self.trainIter)
- t1 = time.time()
- # get the inputs
- inputs = self.convert_tensor_type(data['image'])
- y = self.convert_tensor_type(data['label_prob'])
-
- inputs, y = inputs.to(self.device), y.to(self.device)
- # zero the parameter gradients
- self.optimizer.zero_grad()
-
- # forward + backward + optimize
- outputs1, outputs2 = self.net(inputs)
- t2 = time.time()
-
- loss_sup1 = self.get_loss_value(data, outputs1, y)
- loss_sup2 = self.get_loss_value(data, outputs2, y)
- loss_sup = 0.5 * (loss_sup1 + loss_sup2)
-
- # get pseudo label with dynamic mixture
- outputs_soft1 = torch.softmax(outputs1, dim=1)
- outputs_soft2 = torch.softmax(outputs2, dim=1)
- alpha = random.random()
- soft_pseudo_label = alpha * outputs_soft1.detach() + (1.0-alpha) * outputs_soft2.detach()
-
- loss_dict1 = {"prediction":outputs_soft1, 'ground_truth':soft_pseudo_label}
- loss_dict2 = {"prediction":outputs_soft2, 'ground_truth':soft_pseudo_label}
- loss_reg = 0.5 * (pseudo_loss_func(loss_dict1) + pseudo_loss_func(loss_dict2))
-
- rampup_ratio = get_rampup_ratio(self.glob_it, rampup_start, rampup_end, "sigmoid")
- regular_w = wsl_cfg.get('regularize_w', 8.0) * rampup_ratio
- loss = loss_sup + regular_w*loss_reg
- t3 = time.time()
- loss.backward()
- t4 = time.time()
- self.optimizer.step()
-
- train_loss = train_loss + loss.item()
- train_loss_sup = train_loss_sup + loss_sup.item()
- train_loss_reg = train_loss_reg + loss_reg.item()
-
- data_time = data_time + t1 - t0
- gpu_time = gpu_time + t2 - t1
- loss_time = loss_time + t3 - t2
- back_time = back_time + t4 - t3
- train_avg_loss = train_loss / iter_valid
- train_avg_loss_sup = train_loss_sup / iter_valid
- train_avg_loss_reg = train_loss_reg / iter_valid
-
- train_scalers = {'loss': train_avg_loss, 'loss_sup':train_avg_loss_sup,
- 'loss_reg': train_avg_loss_reg, 'regular_w':regular_w,
- 'data_time': data_time, 'forward_time':gpu_time,
- 'loss_time':loss_time, 'backward_time':back_time}
- return train_scalers
-
- def save_outputs(self, data):
- """
- Save prediction output.
-
- :param data: (dictionary) A data dictionary with prediciton result and other
- information such as input image name.
- """
- output_dir = self.config['testing']['output_dir']
- test_mode = self.config['testing'].get('dmsps_test_mode', 0)
- uct_threshold = self.config['testing'].get('dmsps_uncertainty_threshold', 0.1)
- # DMSPS_test_mode == 0: only save the segmentation label for the main decoder
- # DMSPS_test_mode == 1: save all the results, including the the probability map of each decoder,
- # the uncertainty map, and the confident predictions
- if(not os.path.exists(output_dir)):
- os.makedirs(output_dir, exist_ok=True)
-
- names, pred = data['names'], data['predict']
- pred0, pred1 = pred
- prob0 = scipy.special.softmax(pred0, axis = 1)
- prob1 = scipy.special.softmax(pred1, axis = 1)
- prob_mean = (prob0 + prob1) / 2
- lab0 = np.asarray(np.argmax(prob0, axis = 1), np.uint8)
- lab1 = np.asarray(np.argmax(prob1, axis = 1), np.uint8)
- lab_mean = np.asarray(np.argmax(prob_mean, axis = 1), np.uint8)
-
- # save the output and (optionally) probability predictions
- test_dir = self.config['dataset'].get('test_dir', None)
- if(test_dir is None):
- test_dir = self.config['dataset']['train_dir']
- img_name = names[0][0].split('/')[-1]
- print(img_name)
- lab0_name = img_name
- if(".h5" in lab0_name):
- lab0_name = lab0_name.replace(".h5", ".nii.gz")
- save_nd_array_as_image(lab0[0], output_dir + "/" + lab0_name, test_dir + '/' + names[0][0])
- if(test_mode == 1):
- lab1_name = lab0_name.replace(".nii.gz", "_predaux.nii.gz")
- save_nd_array_as_image(lab1[0], output_dir + "/" + lab1_name, test_dir + '/' + names[0][0])
- C = pred0.shape[1]
- uct = -1.0 * np.sum(prob_mean * np.log(prob_mean), axis=1, keepdims=False)/ np.log(C)
- uct_name = lab0_name.replace(".nii.gz", "_uncertainty.nii.gz")
- save_nd_array_as_image(uct[0], output_dir + "/" + uct_name, test_dir + '/' + names[0][0])
- conf_mask = uct < uct_threshold
- conf_lab = conf_mask * lab_mean + (1 - conf_mask)*4
- conf_lab_name = lab0_name.replace(".nii.gz", "_seeds_expand.nii.gz")
-
- # get the largest connected component in each slice for each class
- D, H, W = conf_lab[0].shape
- from pymic.util.image_process import get_largest_k_components
- for d in range(D):
- lab2d = conf_lab[0][d]
- for c in range(C):
- lab2d_c = lab2d == c
- mask_c = get_largest_k_components(lab2d_c, k = 1)
- diff = lab2d_c != mask_c
- if(np.sum(diff) > 0):
- lab2d[diff] = C
- conf_lab[0][d] = lab2d
- save_nd_array_as_image(conf_lab[0], output_dir + "/" + conf_lab_name, test_dir + '/' + img_name)
-
-
-
\ No newline at end of file
diff --git a/pymic/net_run/weak_sup/wsl_em.py b/pymic/net_run/weak_sup/wsl_em.py
deleted file mode 100644
index 1fee792..0000000
--- a/pymic/net_run/weak_sup/wsl_em.py
+++ /dev/null
@@ -1,97 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-import logging
-import numpy as np
-import time
-import torch
-from pymic.loss.seg.ssl import EntropyLoss
-from pymic.net_run.weak_sup import WSLSegAgent
-from pymic.util.ramps import get_rampup_ratio
-
-class WSLEntropyMinimization(WSLSegAgent):
- """
- Weakly supervised segmentation based on Entropy Minimization.
-
- * Reference: Yves Grandvalet and Yoshua Bengio:
- Semi-supervised Learningby Entropy Minimization.
- `NeurIPS, 2005. `_
-
- :param config: (dict) A dictionary containing the configuration.
- :param stage: (str) One of the stage in `train` (default), `inference` or `test`.
-
- .. note::
-
- In the configuration dictionary, in addition to the four sections (`dataset`,
- `network`, `training` and `inference`) used in fully supervised learning, an
- extra section `weakly_supervised_learning` is needed. See :doc:`usage.wsl` for details.
- """
- def __init__(self, config, stage = 'train'):
- super(WSLEntropyMinimization, self).__init__(config, stage)
-
- def training(self):
- class_num = self.config['network']['class_num']
- iter_valid = self.config['training']['iter_valid']
- wsl_cfg = self.config['weakly_supervised_learning']
- iter_max = self.config['training']['iter_max']
- rampup_start = wsl_cfg.get('rampup_start', 0)
- rampup_end = wsl_cfg.get('rampup_end', iter_max)
- train_loss, train_loss_sup, train_loss_reg = 0, 0, 0
- data_time, gpu_time, loss_time, back_time = 0, 0, 0, 0
- self.net.train()
- for it in range(iter_valid):
- t0 = time.time()
- try:
- data = next(self.trainIter)
- except StopIteration:
- self.trainIter = iter(self.train_loader)
- data = next(self.trainIter)
- t1 = time.time()
- # get the inputs
- inputs = self.convert_tensor_type(data['image'])
- y = self.convert_tensor_type(data['label_prob'])
-
- inputs, y = inputs.to(self.device), y.to(self.device)
-
- # zero the parameter gradients
- self.optimizer.zero_grad()
-
- # forward + backward + optimize
- outputs = self.net(inputs)
- t2 = time.time()
-
- loss_sup = self.get_loss_value(data, outputs, y)
- loss_dict= {"prediction":outputs, 'softmax':True}
- loss_reg = EntropyLoss()(loss_dict)
-
- rampup_ratio = get_rampup_ratio(self.glob_it, rampup_start, rampup_end, "sigmoid")
- regular_w = wsl_cfg.get('regularize_w', 0.1) * rampup_ratio
- loss = loss_sup + regular_w*loss_reg
- t3 = time.time()
- loss.backward()
- t4 = time.time()
- self.optimizer.step()
-
- train_loss = train_loss + loss.item()
- train_loss_sup = train_loss_sup + loss_sup.item()
- train_loss_reg = train_loss_reg + loss_reg.item()
-
- data_time = data_time + t1 - t0
- gpu_time = gpu_time + t2 - t1
- loss_time = loss_time + t3 - t2
- back_time = back_time + t4 - t3
- train_avg_loss = train_loss / iter_valid
- train_avg_loss_sup = train_loss_sup / iter_valid
- train_avg_loss_reg = train_loss_reg / iter_valid
-
- train_scalers = {'loss': train_avg_loss, 'loss_sup':train_avg_loss_sup,
- 'loss_reg':train_avg_loss_reg, 'regular_w':regular_w,
- 'data_time': data_time, 'forward_time':gpu_time,
- 'loss_time':loss_time, 'backward_time':back_time }
- return train_scalers
-
- def write_scalars(self, train_scalars, valid_scalars, lr_value, glob_it):
- loss_reg_scalar = {'train':train_scalars['loss_reg']}
- weight_scalar = {'regular_w':train_scalars['regular_w']}
- self.summ_writer.add_scalars('loss_reg', loss_reg_scalar, glob_it)
- self.summ_writer.add_scalars('weight', weight_scalar, glob_it)
- super(WSLEntropyMinimization, self).write_scalars(train_scalars, valid_scalars, lr_value, glob_it)
\ No newline at end of file
diff --git a/pymic/net_run/weak_sup/wsl_gatedcrf.py b/pymic/net_run/weak_sup/wsl_gatedcrf.py
deleted file mode 100644
index f534ad5..0000000
--- a/pymic/net_run/weak_sup/wsl_gatedcrf.py
+++ /dev/null
@@ -1,123 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-import logging
-import numpy as np
-import time
-import torch
-from pymic.loss.seg.gatedcrf import GatedCRFLoss
-from pymic.net_run.weak_sup import WSLSegAgent
-from pymic.util.ramps import get_rampup_ratio
-
-class WSLGatedCRF(WSLSegAgent):
- """
- Implementation of the Gated CRF loss for weakly supervised segmentation.
-
- * Reference: Anton Obukhov, Stamatios Georgoulis, Dengxin Dai, Luc Van Gool:
- Gated CRF Loss for Weakly Supervised Semantic Image Segmentation.
- `CoRR `_, abs/1906.04651, 2019.
-
- :param config: (dict) A dictionary containing the configuration.
- :param stage: (str) One of the stage in `train` (default), `inference` or `test`.
-
- .. note::
-
- In the configuration dictionary, in addition to the four sections (`dataset`,
- `network`, `training` and `inference`) used in fully supervised learning, an
- extra section `weakly_supervised_learning` is needed. See :doc:`usage.wsl` for details.
- """
- def __init__(self, config, stage = 'train'):
- super(WSLGatedCRF, self).__init__(config, stage)
- # parameters for gated CRF
- wsl_cfg = self.config['weakly_supervised_learning']
- w0 = wsl_cfg.get('GatedCRFLoss_W0'.lower(), 1.0)
- xy0= wsl_cfg.get('GatedCRFLoss_XY0'.lower(), 5)
- rgb= wsl_cfg.get('GatedCRFLoss_rgb'.lower(), 0.1)
- w1 = wsl_cfg.get('GatedCRFLoss_W1'.lower(), 1.0)
- xy1= wsl_cfg.get('GatedCRFLoss_XY1'.lower(), 3)
- kernel0 = {'weight': w0, 'xy': xy0, 'rgb': rgb}
- kernel1 = {'weight': w1, 'xy': xy1}
- self.kernels = [kernel0, kernel1]
- self.radius = wsl_cfg.get('GatedCRFLoss_Radius'.lower(), 5.0)
-
- def training(self):
- class_num = self.config['network']['class_num']
- iter_valid = self.config['training']['iter_valid']
- wsl_cfg = self.config['weakly_supervised_learning']
- iter_max = self.config['training']['iter_max']
- rampup_start = wsl_cfg.get('rampup_start', 0)
- rampup_end = wsl_cfg.get('rampup_end', iter_max)
- train_loss, train_loss_sup, train_loss_reg = 0, 0, 0
- data_time, gpu_time, loss_time, back_time = 0, 0, 0, 0
- gatecrf_loss = GatedCRFLoss()
- self.net.train()
- for it in range(iter_valid):
- t0 = time.time()
- try:
- data = next(self.trainIter)
- except StopIteration:
- self.trainIter = iter(self.train_loader)
- data = next(self.trainIter)
- t1 = time.time()
- # get the inputs
- inputs = self.convert_tensor_type(data['image'])
- y = self.convert_tensor_type(data['label_prob'])
-
- inputs, y = inputs.to(self.device), y.to(self.device)
-
- # zero the parameter gradients
- self.optimizer.zero_grad()
-
- # forward + backward + optimize
- outputs = self.net(inputs)
- t2 = time.time()
- loss_sup = self.get_loss_value(data, outputs, y)
-
- # for gated CRF loss, the input should be like NCHW
- outputs_soft = torch.softmax(outputs, dim=1)
- input_shape = list(inputs.shape)
- if(len(input_shape) == 5):
- [N, C, D, H, W] = input_shape
- new_shape = [N*D, C, H, W]
- inputs = torch.transpose(inputs, 1, 2)
- inputs = torch.reshape(inputs, new_shape)
- [N, C, D, H, W] = list(outputs_soft.shape)
- new_shape = [N*D, C, H, W]
- outputs_soft = torch.transpose(outputs_soft, 1, 2)
- outputs_soft = torch.reshape(outputs_soft, new_shape)
- batch_dict = {'rgb': inputs}
- loss_reg = gatecrf_loss(outputs_soft, self.kernels, self.radius,
- batch_dict,input_shape[-2], input_shape[-1])["loss"]
-
- rampup_ratio = get_rampup_ratio(self.glob_it, rampup_start, rampup_end, "sigmoid")
- regular_w = wsl_cfg.get('regularize_w', 0.1) * rampup_ratio
- loss = loss_sup + regular_w*loss_reg
- t3 = time.time()
- loss.backward()
- t4 = time.time()
- self.optimizer.step()
-
- train_loss = train_loss + loss.item()
- train_loss_sup = train_loss_sup + loss_sup.item()
- train_loss_reg = train_loss_reg + loss_reg.item()
-
- data_time = data_time + t1 - t0
- gpu_time = gpu_time + t2 - t1
- loss_time = loss_time + t3 - t2
- back_time = back_time + t4 - t3
- train_avg_loss = train_loss / iter_valid
- train_avg_loss_sup = train_loss_sup / iter_valid
- train_avg_loss_reg = train_loss_reg / iter_valid
-
- train_scalers = {'loss': train_avg_loss, 'loss_sup':train_avg_loss_sup,
- 'loss_reg':train_avg_loss_reg, 'regular_w':regular_w,
- 'data_time': data_time, 'forward_time':gpu_time,
- 'loss_time':loss_time, 'backward_time':back_time }
- return train_scalers
-
- def write_scalars(self, train_scalars, valid_scalars, lr_value, glob_it):
- loss_reg_scalar = {'train':train_scalars['loss_reg']}
- weight_scalar = {'regular_w':train_scalars['regular_w']}
- self.summ_writer.add_scalars('loss_reg', loss_reg_scalar, glob_it)
- self.summ_writer.add_scalars('weight', weight_scalar, glob_it)
- super(WSLGatedCRF, self).write_scalars(train_scalars, valid_scalars, lr_value, glob_it)
-
\ No newline at end of file
diff --git a/pymic/net_run/weak_sup/wsl_mumford_shah.py b/pymic/net_run/weak_sup/wsl_mumford_shah.py
deleted file mode 100644
index 0343d66..0000000
--- a/pymic/net_run/weak_sup/wsl_mumford_shah.py
+++ /dev/null
@@ -1,99 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-import logging
-import numpy as np
-import time
-import torch
-from pymic.loss.seg.mumford_shah import MumfordShahLoss
-from pymic.net_run.weak_sup import WSLSegAgent
-from pymic.util.ramps import get_rampup_ratio
-
-class WSLMumfordShah(WSLSegAgent):
- """
- Weakly supervised learning with Mumford Shah Loss.
-
- * Reference: Boah Kim and Jong Chul Ye: Mumford–Shah Loss Functional
- for Image Segmentation With Deep Learning.
- `IEEE TIP `_, 2019.
-
- :param config: (dict) A dictionary containing the configuration.
- :param stage: (str) One of the stage in `train` (default), `inference` or `test`.
-
- .. note::
-
- In the configuration dictionary, in addition to the four sections (`dataset`,
- `network`, `training` and `inference`) used in fully supervised learning, an
- extra section `weakly_supervised_learning` is needed. See :doc:`usage.wsl` for details.
- """
- def __init__(self, config, stage = 'train'):
- super(WSLMumfordShah, self).__init__(config, stage)
-
- def training(self):
- class_num = self.config['network']['class_num']
- iter_valid = self.config['training']['iter_valid']
- wsl_cfg = self.config['weakly_supervised_learning']
- iter_max = self.config['training']['iter_max']
- rampup_start = wsl_cfg.get('rampup_start', 0)
- rampup_end = wsl_cfg.get('rampup_end', iter_max)
- train_loss, train_loss_sup, train_loss_reg = 0, 0, 0
- data_time, gpu_time, loss_time, back_time = 0, 0, 0, 0
-
- reg_loss_calculator = MumfordShahLoss(wsl_cfg)
- self.net.train()
- for it in range(iter_valid):
- t0 = time.time()
- try:
- data = next(self.trainIter)
- except StopIteration:
- self.trainIter = iter(self.train_loader)
- data = next(self.trainIter)
- t1 = time.time()
- # get the inputs
- inputs = self.convert_tensor_type(data['image'])
- y = self.convert_tensor_type(data['label_prob'])
-
- inputs, y = inputs.to(self.device), y.to(self.device)
-
- # zero the parameter gradients
- self.optimizer.zero_grad()
-
- # forward + backward + optimize
- outputs = self.net(inputs)
- t2 = time.time()
- loss_sup = self.get_loss_value(data, outputs, y)
- loss_dict = {"prediction":outputs, 'image':inputs}
- loss_reg = reg_loss_calculator(loss_dict)
-
- rampup_ratio = get_rampup_ratio(self.glob_it, rampup_start, rampup_end, "sigmoid")
- regular_w = wsl_cfg.get('regularize_w', 0.1) * rampup_ratio
- loss = loss_sup + regular_w*loss_reg
- t3 = time.time()
- loss.backward()
- t4 = time.time()
- self.optimizer.step()
-
- train_loss = train_loss + loss.item()
- train_loss_sup = train_loss_sup + loss_sup.item()
- train_loss_reg = train_loss_reg + loss_reg.item()
-
- data_time = data_time + t1 - t0
- gpu_time = gpu_time + t2 - t1
- loss_time = loss_time + t3 - t2
- back_time = back_time + t4 - t3
- train_avg_loss = train_loss / iter_valid
- train_avg_loss_sup = train_loss_sup / iter_valid
- train_avg_loss_reg = train_loss_reg / iter_valid
-
- train_scalers = {'loss': train_avg_loss, 'loss_sup':train_avg_loss_sup,
- 'loss_reg':train_avg_loss_reg, 'regular_w':regular_w,
- 'data_time': data_time, 'forward_time':gpu_time,
- 'loss_time':loss_time, 'backward_time':back_time }
- return train_scalers
-
- def write_scalars(self, train_scalars, valid_scalars, lr_value, glob_it):
- loss_reg_scalar = {'train':train_scalars['loss_reg']}
- weight_scalar = {'regular_w':train_scalars['regular_w']}
- self.summ_writer.add_scalars('loss_reg', loss_reg_scalar, glob_it)
- self.summ_writer.add_scalars('weight', weight_scalar, glob_it)
- super(WSLMumfordShah, self).write_scalars(train_scalars, valid_scalars, lr_value, glob_it)
-
\ No newline at end of file
diff --git a/pymic/net_run/weak_sup/wsl_psseg.py b/pymic/net_run/weak_sup/wsl_psseg.py
deleted file mode 100644
index f41ab20..0000000
--- a/pymic/net_run/weak_sup/wsl_psseg.py
+++ /dev/null
@@ -1,197 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-import logging
-import math
-import numpy as np
-import torch
-import torch.nn.functional as F
-import torch.nn as nn
-import time
-from pymic.loss.seg.dice import DiceLoss
-from pymic.loss.seg.ce import CrossEntropyLoss
-from pymic.net_run.weak_sup import WSLSegAgent
-from pymic.util.ramps import get_rampup_ratio
-
-
-class WSLPSSEG(WSLSegAgent):
- """
- PS-Seg: Learning from Partial Scribbles for 3D Multiple Abdominal Organ Segmentation
-
- * Reference: Meng Han, Xiaochuan Ma, Xiangde Luo, Wenjun Liao, Shichuan Zhang, Shaoting Zhang, Guotai Wang.
- PS-seg: Learning from partial scribbles for 3D multiple abdominal organ segmentation.
- `Neurocomputing 2026. `_
-
- :param config: (dict) A dictionary containing the configuration.
- :param stage: (str) One of the stage in `train` (default), `inference` or `test`.
-
- .. note::
-
- In the configuration dictionary, in addition to the four sections (`dataset`,
- `network`, `training` and `inference`) used in fully supervised learning, an
- extra section `weakly_supervised_learning` is needed. See :doc:`usage.wsl` for details.
- """
-
- def __init__(self, config, stage="train"):
- super(WSLPSSEG, self).__init__(config, stage)
-
- def create_network(self):
- if(self.net is None):
- net_name = self.config['network']['net_type']
- if net_name not in ["TDNet3D", "TDNet2D"]:
- logging.warn("By defualt, the TDNet3D or TDNet2D are used by PSSEG." +
- "using your customized network {0:} should be careful.".format(net_name))
- if(net_name not in self.net_dict):
- raise ValueError("Undefined network {0:}".format(net_name))
- self.net = self.net_dict[net_name](self.config['network'])
- super(WSLPSSEG, self).create_network()
-
- def weight_with_uncertainty(self, p):
- class_num = int(p.shape[1])
- unc = -torch.sum(p * torch.log(p), dim=1, keepdim=True)
- unc = unc / torch.tensor(np.log(class_num))
- y1 = torch.exp(-unc)
- return y1
-
-
- def calculate_uspc_loss_by_KL(self, outputs_list):
- probs = [F.softmax(logits, dim=1) for i, logits in enumerate(outputs_list)]
- probs = [5e-4 + p * (1 - 1e-3) for p in probs]
- mixture_label = (torch.stack(probs)).mean(axis=0)
- weight = self.weight_with_uncertainty(mixture_label)
- kl_values = []
- for prob in probs:
- kl_i = prob * (torch.log(prob) - torch.log(mixture_label))
- kl_i = torch.sum(kl_i, dim = 1, keepdim = True)
- kl_i = torch.sum(weight * kl_i) / torch.sum(weight)
- kl_values.append(kl_i)
- consistency = sum(kl_values) / len(probs)
- loss_KL = torch.mean(consistency)
-
- return loss_KL
-
- def calculate_ccac_loss_by_MSE(self, outputsSoft_list):
- batch_size = outputsSoft_list[0].shape[0]
- num_classes = outputsSoft_list[0].shape[1]
- outputsSoft_list_r = [
- item.reshape(batch_size, num_classes, -1) for item in outputsSoft_list
- ]
- outputsSoft_list_rNorm = [
- F.normalize(item, p=2, dim=2) for item in outputsSoft_list_r
- ]
- outputsSoft_list_rNormT = [
- item.permute(0, 2, 1) for item in outputsSoft_list_rNorm
- ]
-
- affinity_list = []
- for i in range(len(outputsSoft_list)):
- outputsSoft_list_rNormT_other = (
- outputsSoft_list_rNormT[:i] + outputsSoft_list_rNormT[i + 1 :]
- )
- for j in range(len(outputsSoft_list_rNormT_other)):
- affinity_ori = torch.bmm(
- outputsSoft_list_rNorm[i], outputsSoft_list_rNormT_other[j]
- )
- affinity_list.append(affinity_ori)
-
- maskI = (
- torch.eye(affinity_list[0].shape[1])
- .repeat(affinity_list[1].shape[0], 1, 1)
- .cuda()
- )
-
- consistency_loss = 0
- for i in range(len(affinity_list)):
- consistency_loss = consistency_loss + torch.mean(
- (affinity_list[i] - maskI) ** 2
- )
- consistency_loss = consistency_loss / len(affinity_list)
- return consistency_loss
-
- def training(self):
- class_num = self.config["network"]["class_num"]
- iter_valid = self.config["training"]["iter_valid"]
- wsl_cfg = self.config['weakly_supervised_learning']
- rampup_start = wsl_cfg.get('rampup_start', 0)
- rampup_end = wsl_cfg.get('rampup_end', 2000)
-
- train_loss, train_loss_sup, train_loss_uspc, train_loss_ccac = 0, 0, 0, 0
- data_time, gpu_time, loss_time, back_time = 0, 0, 0, 0
-
- self.net.train()
- for it in range(iter_valid):
- t0 = time.time()
- try:
- data = next(self.trainIter)
- except StopIteration:
- self.trainIter = iter(self.train_loader)
- data = next(self.trainIter)
- t1 = time.time()
- # get the inputs
- inputs = self.convert_tensor_type(data["image"])
- y = self.convert_tensor_type(data["label_prob"])
-
- inputs, y = inputs.to(self.device), y.to(self.device)
- # zero the parameter gradients
- self.optimizer.zero_grad()
-
- # forward + backward + optimize
- outputs_list, embeddings1_list, embeddings2_list, embeddings3_list = self.net(inputs)
- t2 = time.time()
-
- # supervised
- loss_sup_list = [
- self.get_loss_value(data, output, y) for output in outputs_list
- ]
- loss_sup = sum(loss_sup_list) / len(loss_sup_list)
-
- # unsupervised loss
- rampup_ratio = get_rampup_ratio(self.glob_it, rampup_start, rampup_end, "sigmoid")
- w_uspc = wsl_cfg.get('uspc_weight', 8.0) * rampup_ratio
- w_ccac = wsl_cfg.get('ccac_weight', 0.1) * rampup_ratio
-
- loss_uspc = self.calculate_uspc_loss_by_KL(outputs_list)
- loss_aff0 = self.calculate_ccac_loss_by_MSE(outputs_list)
- loss_aff1 = self.calculate_ccac_loss_by_MSE(embeddings1_list)
- loss_aff2 = self.calculate_ccac_loss_by_MSE(embeddings2_list)
- loss_aff3 = self.calculate_ccac_loss_by_MSE(embeddings3_list)
- loss_ccac = (loss_aff0 + loss_aff1 + loss_aff2 + loss_aff3) / 4.0
-
- loss = loss_sup + w_uspc * loss_uspc + w_ccac * loss_ccac
-
- t3 = time.time()
- loss.backward()
- t4 = time.time()
- self.optimizer.step()
-
- train_loss = train_loss + loss.item()
- train_loss_sup = train_loss_sup + loss_sup.item()
- train_loss_uspc = train_loss_uspc + loss_uspc.item()
- train_loss_ccac = train_loss_ccac + loss_ccac.item()
-
- data_time = data_time + t1 - t0
- gpu_time = gpu_time + t2 - t1
- loss_time = loss_time + t3 - t2
- back_time = back_time + t4 - t3
- train_avg_loss = train_loss / iter_valid
- train_avg_loss_sup = train_loss_sup / iter_valid
- train_avg_loss_uspc = train_loss_uspc / iter_valid
- train_avg_loss_ccac = train_loss_ccac / iter_valid
-
- train_scalers = {
- "loss": train_avg_loss, 'loss_sup':train_avg_loss_sup,
- "loss_uspc" :train_avg_loss_uspc, "loss_ccac" :train_avg_loss_ccac,
- "weight_uspc": w_uspc, "weight_ccac": w_ccac,
- "data_time": data_time, "forward_time": gpu_time,
- "loss_time": loss_time, "backward_time": back_time,
- }
- return train_scalers
-
- def write_scalars(self, train_scalars, valid_scalars, lr_value, glob_it):
- loss_uspc_scalar = {'train':train_scalars['loss_uspc']}
- loss_ccac_scalar = {'train':train_scalars['loss_ccac']}
- weight_scalar = {'uspc':train_scalars['weight_uspc'],
- 'ccac':train_scalars['weight_ccac']}
- self.summ_writer.add_scalars('loss_uspc', loss_uspc_scalar, glob_it)
- self.summ_writer.add_scalars('loss_ccac', loss_ccac_scalar, glob_it)
- self.summ_writer.add_scalars('weight', weight_scalar, glob_it)
- super(WSLPSSEG, self).write_scalars(train_scalars, valid_scalars, lr_value, glob_it)
diff --git a/pymic/net_run/weak_sup/wsl_tv.py b/pymic/net_run/weak_sup/wsl_tv.py
deleted file mode 100644
index 9b671ae..0000000
--- a/pymic/net_run/weak_sup/wsl_tv.py
+++ /dev/null
@@ -1,93 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-import logging
-import numpy as np
-import time
-import torch
-from pymic.loss.seg.ssl import TotalVariationLoss
-from pymic.net_run.weak_sup import WSLSegAgent
-from pymic.util.ramps import get_rampup_ratio
-
-class WSLTotalVariation(WSLSegAgent):
- """
- Weakly suepervised segmentation with Total Variation regularization.
-
- :param config: (dict) A dictionary containing the configuration.
- :param stage: (str) One of the stage in `train` (default), `inference` or `test`.
-
- .. note::
-
- In the configuration dictionary, in addition to the four sections (`dataset`,
- `network`, `training` and `inference`) used in fully supervised learning, an
- extra section `weakly_supervised_learning` is needed. See :doc:`usage.wsl` for details.
- """
- def __init__(self, config, stage = 'train'):
- super(WSLTotalVariation, self).__init__(config, stage)
-
- def training(self):
- class_num = self.config['network']['class_num']
- iter_valid = self.config['training']['iter_valid']
- wsl_cfg = self.config['weakly_supervised_learning']
- iter_max = self.config['training']['iter_max']
- rampup_start = wsl_cfg.get('rampup_start', 0)
- rampup_end = wsl_cfg.get('rampup_end', iter_max)
- train_loss, train_loss_sup, train_loss_reg = 0, 0, 0
- data_time, gpu_time, loss_time, back_time = 0, 0, 0, 0
- self.net.train()
- for it in range(iter_valid):
- t0 = time.time()
- try:
- data = next(self.trainIter)
- except StopIteration:
- self.trainIter = iter(self.train_loader)
- data = next(self.trainIter)
- t1 = time.time()
- # get the inputs
- inputs = self.convert_tensor_type(data['image'])
- y = self.convert_tensor_type(data['label_prob'])
-
- inputs, y = inputs.to(self.device), y.to(self.device)
-
- # zero the parameter gradients
- self.optimizer.zero_grad()
-
- # forward + backward + optimize
- outputs = self.net(inputs)
- t2 = time.time()
- loss_sup = self.get_loss_value(data, outputs, y)
- loss_dict = {"prediction":outputs, 'softmax':True}
- loss_reg = TotalVariationLoss()(loss_dict)
-
- rampup_ratio = get_rampup_ratio(self.glob_it, rampup_start, rampup_end, "sigmoid")
- regular_w = wsl_cfg.get('regularize_w', 0.1) * rampup_ratio
- loss = loss_sup + regular_w*loss_reg
- t3 = time.time()
- loss.backward()
- t4 = time.time()
- self.optimizer.step()
-
- train_loss = train_loss + loss.item()
- train_loss_sup = train_loss_sup + loss_sup.item()
- train_loss_reg = train_loss_reg + loss_reg.item()
-
- data_time = data_time + t1 - t0
- gpu_time = gpu_time + t2 - t1
- loss_time = loss_time + t3 - t2
- back_time = back_time + t4 - t3
- train_avg_loss = train_loss / iter_valid
- train_avg_loss_sup = train_loss_sup / iter_valid
- train_avg_loss_reg = train_loss_reg / iter_valid
-
- train_scalers = {'loss': train_avg_loss, 'loss_sup':train_avg_loss_sup,
- 'loss_reg':train_avg_loss_reg, 'regular_w':regular_w,
- 'data_time': data_time, 'forward_time':gpu_time,
- 'loss_time':loss_time, 'backward_time':back_time }
- return train_scalers
-
- def write_scalars(self, train_scalars, valid_scalars, lr_value, glob_it):
- loss_reg_scalar = {'train':train_scalars['loss_reg']}
- weight_scalar = {'regular_w':train_scalars['regular_w']}
- self.summ_writer.add_scalars('loss_reg', loss_reg_scalar, glob_it)
- self.summ_writer.add_scalars('weight', weight_scalar, glob_it)
- super(WSLTotalVariation, self).write_scalars(train_scalars, valid_scalars, lr_value, glob_it)
-
\ No newline at end of file
diff --git a/pymic/net_run/weak_sup/wsl_ustm.py b/pymic/net_run/weak_sup/wsl_ustm.py
deleted file mode 100644
index c29bfab..0000000
--- a/pymic/net_run/weak_sup/wsl_ustm.py
+++ /dev/null
@@ -1,151 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-import logging
-import numpy as np
-import random
-import time
-import torch
-import torch.nn.functional as F
-from pymic.net.net_dict_seg import SegNetDict
-from pymic.net_run.weak_sup import WSLSegAgent
-from pymic.util.ramps import get_rampup_ratio
-
-class WSLUSTM(WSLSegAgent):
- """
- USTM for scribble-supervised segmentation.
-
- * Reference: Xiaoming Liu, Quan Yuan, Yaozong Gao, Helei He, Shuo Wang,
- Xiao Tang, Jinshan Tang, Dinggang Shen: Weakly Supervised Segmentation
- of COVID19 Infection with Scribble Annotation on CT Images.
- `Patter Recognition `_, 2022.
-
- :param config: (dict) A dictionary containing the configuration.
- :param stage: (str) One of the stage in `train` (default), `inference` or `test`.
-
- .. note::
-
- In the configuration dictionary, in addition to the four sections (`dataset`,
- `network`, `training` and `inference`) used in fully supervised learning, an
- extra section `weakly_supervised_learning` is needed. See :doc:`usage.wsl` for details.
- """
- def __init__(self, config, stage = 'train'):
- super(WSLUSTM, self).__init__(config, stage)
- self.net_ema = None
-
- def create_network(self):
- super(WSLUSTM, self).create_network()
- if(self.net_ema is None):
- net_name = self.config['network']['net_type']
- if(net_name not in SegNetDict):
- raise ValueError("Undefined network {0:}".format(net_name))
- self.net_ema = SegNetDict[net_name](self.config['network'])
- if(self.tensor_type == 'float'):
- self.net_ema.float()
- else:
- self.net_ema.double()
-
- def training(self):
- class_num = self.config['network']['class_num']
- iter_valid = self.config['training']['iter_valid']
- wsl_cfg = self.config['weakly_supervised_learning']
- iter_max = self.config['training']['iter_max']
- rampup_start = wsl_cfg.get('rampup_start', 0)
- rampup_end = wsl_cfg.get('rampup_end', iter_max)
- train_loss, train_loss_sup, train_loss_reg = 0, 0, 0
- data_time, gpu_time, loss_time, back_time = 0, 0, 0, 0
- self.net.train()
- self.net_ema.to(self.device)
- for it in range(iter_valid):
- t0 = time.time()
- try:
- data = next(self.trainIter)
- except StopIteration:
- self.trainIter = iter(self.train_loader)
- data = next(self.trainIter)
- t1 = time.time()
- # get the inputs
- inputs = self.convert_tensor_type(data['image'])
- y = self.convert_tensor_type(data['label_prob'])
-
- inputs, y = inputs.to(self.device), y.to(self.device)
-
- # zero the parameter gradients
- self.optimizer.zero_grad()
-
- # forward + backward + optimize
- noise = torch.clamp(torch.randn_like(inputs) * 0.1, -0.2, 0.2)
- outputs = self.net(inputs + noise)
- t2 = time.time()
- out_prob= F.softmax(outputs, dim=1)
- loss_sup = self.get_loss_value(data, outputs, y)
-
- rot_times = random.randrange(0, 4)
- inputs_rot= torch.rot90(inputs, rot_times, [-2, -1])
- noise = torch.clamp(torch.randn_like(inputs_rot) * 0.1, -0.2, 0.2)
- with torch.no_grad():
- ema_inputs = inputs_rot + noise
- ema_outputs = self.net_ema(ema_inputs)
- ema_out_prob= F.softmax(ema_outputs, dim=1)
- out_prob_rot = torch.rot90(out_prob, rot_times, [-2, -1])
- square_error = torch.square(out_prob_rot - ema_out_prob)
-
- # the forward pass number for uncertainty estimation
- T = wsl_cfg.get("ustm_mcdroput_n", 8)
- preds = torch.zeros([T] + list(y.shape)).to(self.device)
- for i in range(T//2):
- ema_inputs_r = torch.cat([inputs_rot, inputs_rot], dim = 0)
- ema_inputs_r = ema_inputs_r + \
- torch.clamp(torch.randn_like(ema_inputs_r) * 0.1, -0.2, 0.2)
- ema_inputs_r = ema_inputs_r.to(self.device)
- with torch.no_grad():
- ema_outputs_r = self.net_ema(ema_inputs_r)
- # reshape from [2B, C, D, H, W] to [2, B, C, D, H, W]
- preds[2*i:2*(i+1)] = ema_outputs_r.reshape([2]+list(y.shape))
- preds = torch.softmax(preds, dim = 2)
- preds = torch.mean(preds, dim = 0)
- uncertainty = -1.0 * torch.sum(preds*torch.log(preds + 1e-6),
- dim=1, keepdim=True)
-
- rampup_ratio = get_rampup_ratio(self.glob_it, rampup_start, rampup_end, "sigmoid")
- class_num = list(y.shape)[1]
- threshold = (0.75+0.25*rampup_ratio)*np.log(class_num)
- mask = (uncertainty < threshold).float()
- loss_reg = torch.sum(mask*square_error)/(2*torch.sum(mask)+1e-16)
-
- regular_w = wsl_cfg.get('regularize_w', 0.1) * rampup_ratio
- loss = loss_sup + regular_w*loss_reg
- t3 = time.time()
- loss.backward()
- self.optimizer.step()
-
- # update EMA
- alpha = wsl_cfg.get('ema_decay', 0.99)
- alpha = min(1 - 1 / (self.glob_it / iter_valid + 1), alpha)
- for ema_param, param in zip(self.net_ema.parameters(), self.net.parameters()):
- ema_param.data.mul_(alpha).add(param.data, alpha = 1.0 - alpha)
- t4 = time.time()
-
- train_loss = train_loss + loss.item()
- train_loss_sup = train_loss_sup + loss_sup.item()
- train_loss_reg = train_loss_reg + loss_reg.item()
-
- data_time = data_time + t1 - t0
- gpu_time = gpu_time + t2 - t1
- loss_time = loss_time + t3 - t2
- back_time = back_time + t4 - t3
- train_avg_loss = train_loss / iter_valid
- train_avg_loss_sup = train_loss_sup / iter_valid
- train_avg_loss_reg = train_loss_reg / iter_valid
-
- train_scalers = {'loss': train_avg_loss, 'loss_sup':train_avg_loss_sup,
- 'loss_reg':train_avg_loss_reg, 'regular_w':regular_w,
- 'data_time': data_time, 'forward_time':gpu_time,
- 'loss_time':loss_time, 'backward_time':back_time }
- return train_scalers
-
- def write_scalars(self, train_scalars, valid_scalars, lr_value, glob_it):
- loss_reg_scalar = {'train':train_scalars['loss_reg']}
- weight_scalar = {'regular_w':train_scalars['regular_w']}
- self.summ_writer.add_scalars('loss_reg', loss_reg_scalar, glob_it)
- self.summ_writer.add_scalars('weight', weight_scalar, glob_it)
- super(WSLUSTM, self).write_scalars(train_scalars, valid_scalars, lr_value, glob_it)
\ No newline at end of file
diff --git a/pymic/test/all_scalars.json b/pymic/test/all_scalars.json
deleted file mode 100644
index 7f8cfe4..0000000
--- a/pymic/test/all_scalars.json
+++ /dev/null
@@ -1 +0,0 @@
-{"runs/Feb19_16-56-35_uestc-MW50-SV0/data/scalar_group/xsinx": [[1550566595.4205954, 0, 0.0], [1550566598.4463055, 1, 0.8414709848078965], [1550566598.449873, 2, 1.8185948536513634], [1550566598.4532738, 3, 0.4233600241796016], [1550566598.4569345, 4, -3.027209981231713], [1550566598.4605434, 5, -4.794621373315692], [1550566598.4641416, 6, -1.6764929891935552], [1550566598.4675682, 7, 4.598906191031523], [1550566598.4709454, 8, 7.914865972987054], [1550566598.4742885, 9, 3.7090663671758093], [1550566598.47764, 10, -5.440211108893697], [1550566601.5320354, 11, -10.999892272057739], [1550566601.5362756, 12, -6.43887501600522], [1550566601.5408523, 13, 5.462171478746332], [1550566601.545353, 14, 13.868502979728184], [1550566601.5486279, 15, 9.754317602356753], [1550566601.5519092, 16, -4.606453066641045], [1550566601.5551867, 17, -16.343757361952466], [1550566601.558466, 18, -13.51777044189017], [1550566601.5617387, 19, 2.8476669835960946], [1550566601.5650127, 20, 18.258905014552553], [1550566604.707999, 21, 17.56976840925718], [1550566604.7115328, 22, -0.1947288043888853], [1550566604.7149553, 23, -19.463069296028923], [1550566604.718341, 24, -21.733880688158973], [1550566604.721635, 25, -3.3087937524443256], [1550566604.724932, 26, 19.82651971246967], [1550566604.7282171, 27, 25.82215006692158], [1550566604.7315044, 28, 7.585362072620333], [1550566604.7347975, 29, -19.245382642176057], [1550566604.7380898, 30, -29.640948722785854], [1550566607.6193054, 31, -12.525167005015016], [1550566607.622977, 32, 17.6456537997341], [1550566607.6268091, 33, 32.99709138353982], [1550566607.6309326, 34, 17.98881132808081], [1550566607.6350362, 35, -14.986393432365286], [1550566607.6387522, 36, -35.704038723952166], [1550566607.6420105, 37, -23.81091093420898], [1550566607.6453218, 38, 11.262005990956641], [1550566607.6485894, 39, 37.58802006507943], [1550566607.6518698, 40, 29.804526419173953], [1550566610.788568, 41, -6.503529420993068], [1550566610.7942996, 42, -38.49390501245662], [1550566610.800043, 43, -35.76631393302973], [1550566610.8057463, 44, 0.7788847046381974], [1550566610.8114905, 45, 38.29065860403533], [1550566610.8176525, 46, 41.48226399184522], [1550566610.823419, 47, 5.807936769025528], [1550566610.8292584, 48, -36.87622374353601], [1550566610.8351147, 49, -46.733879985214124], [1550566610.8412092, 50, -13.118742685196437], [1550566613.9934998, 51, 34.18168796801211], [1550566613.9987664, 52, 51.30463478610524], [1550566614.004006, 53, 20.98403295963721], [1550566614.0092344, 54, -30.17460863798728], [1550566614.0144439, 55, -54.98653453472409], [1550566614.019653, 56, -29.206856116867066], [1550566614.0248625, 57, 24.86139104912602], [1550566614.0300744, 58, 57.586613588903155], [1550566614.0352824, 59, 37.56754242120913], [1550566614.0404866, 60, -18.288637266133], [1550566617.1852794, 61, -58.93318397051197], [1550566617.1906264, 62, -45.82920319225182], [1550566617.1959205, 63, 10.543409119076836], [1550566617.2012494, 64, 58.8816664445946], [1550566617.2066007, 65, 53.743864166856724], [1550566617.211956, 66, -1.7523761655818084], [1550566617.2174122, 67, -57.319838591346596], [1550566617.223191, 68, -61.059082286871806], [1550566617.2286913, 69, -7.920152151039918], [1550566617.234499, 70, 54.17234770905224], [1550566620.4757872, 71, 67.5248803810606], [1550566620.481102, 72, 18.27528211886661], [1550566620.4864123, 73, -49.40435285277346], [1550566620.4917448, 74, -72.9008232746503], [1550566620.4970431, 75, -29.083622655707284], [1550566620.5023334, 76, 43.024180404261706], [1550566620.507733, 77, 76.96305221071631], [1550566620.5130665, 78, 40.09031956702775], [1550566620.5184102, 79, -35.084900827893165], [1550566620.5237374, 80, -79.51109231387002], [1550566623.7218773, 81, -51.020927536230765], [1550566623.7271514, 82, 25.684760159512983], [1550566623.7325153, 83, 80.37425027131539], [1550566623.7378001, 84, 61.58798688615654], [1550566623.7430358, 85, -14.966427695629902], [1550566623.7482684, 86, -79.41742644234914], [1550566623.753504, 87, -71.49815178688156], [1550566623.7587154, 88, 3.11505064056214], [1550566623.7639425, 89, 76.54617711730835], [1550566623.7691612, 90, 80.45969972405021], [1550566626.9657416, 91, 9.644863569355273], [1550566626.9710855, 92, -71.71087840465403], [1550566626.9766364, 93, -88.1902391381051], [1550566626.982015, 94, -23.053686633959508], [1550566626.9873207, 95, 64.9098628999315], [1550566626.9926276, 96, 94.42442356169711], [1550566626.9982402, 97, 36.821950685669606], [1550566627.0036604, 98, -56.19142345506145], [1550566627.009098, 99, -98.92147658444901]], "runs/Feb19_16-56-35_uestc-MW50-SV0/data/scalar_group/xcosx": [[1550566595.4205954, 0, 0.0], [1550566598.4463055, 1, 0.5403023058681398], [1550566598.449873, 2, -0.8322936730942848], [1550566598.4532738, 3, -2.9699774898013365], [1550566598.4569345, 4, -2.6145744834544478], [1550566598.4605434, 5, 1.4183109273161312], [1550566598.4641416, 6, 5.761021719902196], [1550566598.4675682, 7, 5.277315780403132], [1550566598.4709454, 8, -1.1640002704689083], [1550566598.4742885, 9, -8.200172356962092], [1550566598.47764, 10, -8.390715290764524], [1550566601.5320354, 11, 0.04868267786855864], [1550566601.5362756, 12, 10.126247504789905], [1550566601.5408523, 13, 11.796808158852551], [1550566601.545353, 14, 1.9143210549096705], [1550566601.5486279, 15, -11.39531869288232], [1550566601.5519092, 16, -15.322551685174155], [1550566601.5551867, 17, -4.677776746877147], [1550566601.558466, 18, 11.885700748393443], [1550566601.5617387, 19, 18.785387745546714], [1550566601.5650127, 20, 8.161641236267839], [1550566604.707999, 21, -11.502314464709636], [1550566604.7115328, 22, -21.999138180682017], [1550566604.7149553, 23, -12.255159467668143], [1550566604.718341, 24, 10.180296176087928], [1550566604.721635, 25, 24.78007029658684], [1550566604.724932, 26, 16.81990238054465], [1550566604.7282171, 27, -7.887747835813577], [1550566604.7315044, 28, -26.952964256779865], [1550566604.7347975, 29, -21.693668360981007], [1550566604.7380898, 30, 4.6275434966275215], [1550566607.6193054, 31, 28.35701309194047], [1550566607.622977, 32, 26.695147536208328], [1550566607.6268091, 33, -0.4381326583609628], [1550566607.6309326, 34, -28.851389342676576], [1550566607.6350362, 35, -31.629227178202736], [1550566607.6387522, 36, -4.606692826586569], [1550566607.6420105, 37, 28.320319921977706], [1550566607.6453218, 38, 36.292798473797205], [1550566607.6485894, 39, 10.399074362037553], [1550566607.6518698, 40, -26.677522466090476], [1550566610.788568, 41, -40.480910378476885], [1550566610.7942996, 42, -16.799383229510752], [1550566610.800043, 43, 23.869871965386903], [1550566610.8057463, 44, 43.993105580498415], [1550566610.8114905, 45, 23.63948949679784], [1550566610.8176525, 46, -19.8801854646998], [1550566610.823419, 47, -46.63976705009365], [1550566610.8292584, 48, -30.726928294521585], [1550566610.8351147, 49, 14.729034643438217], [1550566610.8412092, 50, 48.248301424605664], [1550566613.9934998, 51, 37.84986403750291], [1550566613.9987664, 52, -8.475520601376685], [1550566614.004006, 53, -48.6689876692423], [1550566614.0092344, 54, -44.78273097461011], [1550566614.0144439, 55, 1.2169715944075654], [1550566614.019653, 56, 47.780326032464714], [1550566614.0248625, 57, 51.29240913724404], [1550566614.0300744, 58, 6.912447856031518], [1550566614.0352824, 59, -45.493733155574866], [1550566614.0404866, 60, -57.14477882490938], [1550566617.1852794, 61, -15.744199792234316], [1550566617.1906264, 62, 41.75744406406235], [1550566617.1959205, 63, 62.11148463970063], [1550566617.2012494, 64, 25.0788627474912], [1550566617.2066007, 65, -36.559500330481185], [1550566617.211956, 66, -65.97673209377909], [1550566617.2174122, 67, -34.69057658589684], [1550566617.223191, 68, 29.929725529730767], [1550566617.2286913, 69, 68.54393620083674], [1550566617.234499, 70, 44.33234421604099], [1550566620.4757872, 71, -21.94061369979102], [1550566620.481102, 72, -69.64204235571954], [1550566620.4864123, 73, -53.74206843059406], [1550566620.4917448, 74, 12.707083295477538], [1550566620.4970431, 75, 69.1313452293562], [1550566620.5023334, 76, 62.64918116417439], [1550566620.507733, 77, -2.3850774433036674], [1550566620.5130665, 78, -66.90864127310905], [1550566620.5184102, 79, -70.78170479648608], [1550566620.5237374, 80, -8.830979507123805], [1550566623.7218773, 81, 62.91156454375213], [1550566623.7271514, 82, 77.87357122636854], [1550566623.7325153, 83, 20.711829791787064], [1550566623.7378001, 84, -57.12197362933646], [1550566623.7430358, 85, -83.67201468849356], [1550566623.7482684, 86, -32.9980662656778], [1550566623.753504, 87, 49.56827908108214], [1550566623.7587154, 88, 87.94484896517098], [1550566623.7639425, 89, 45.40575699980854], [1550566623.7691612, 90, -40.32662545162531], [1550566626.9657416, 91, -90.48743894446633], [1550566626.9710855, 92, -57.63288920775119], [1550566626.9766364, 93, 29.520869241332253], [1550566626.982015, 94, 91.12918046697882], [1550566626.9873207, 95, 69.36648829450787], [1550566626.9926276, 96, -17.32132313194406], [1550566626.9982402, 97, -89.73931104985215], [1550566627.0036604, 98, -80.290248038563], [1550566627.009098, 99, 3.942267158920751]], "runs/Feb19_16-56-35_uestc-MW50-SV0/data/scalar_group/arctanx": [[1550566595.4205954, 0, 0.0], [1550566598.4463055, 1, 0.7853981633974483], [1550566598.449873, 2, 1.1071487177940904], [1550566598.4532738, 3, 1.2490457723982544], [1550566598.4569345, 4, 1.3258176636680326], [1550566598.4605434, 5, 1.373400766945016], [1550566598.4641416, 6, 1.4056476493802699], [1550566598.4675682, 7, 1.4288992721907328], [1550566598.4709454, 8, 1.446441332248135], [1550566598.4742885, 9, 1.460139105621001], [1550566598.47764, 10, 1.4711276743037347], [1550566601.5320354, 11, 1.4801364395941514], [1550566601.5362756, 12, 1.4876550949064553], [1550566601.5408523, 13, 1.4940244355251187], [1550566601.545353, 14, 1.4994888620096063], [1550566601.5486279, 15, 1.5042281630190728], [1550566601.5519092, 16, 1.5083775167989393], [1550566601.5551867, 17, 1.512040504079174], [1550566601.558466, 18, 1.5152978215491797], [1550566601.5617387, 19, 1.5182132651839548], [1550566601.5650127, 20, 1.5208379310729538], [1550566604.707999, 21, 1.5232132235179132], [1550566604.7115328, 22, 1.5253730473733196], [1550566604.7149553, 23, 1.5273454314033659], [1550566604.718341, 24, 1.5291537476963082], [1550566604.721635, 25, 1.5308176396716067], [1550566604.724932, 26, 1.5323537367737086], [1550566604.7282171, 27, 1.5337762109209665], [1550566604.7315044, 28, 1.5350972141155725], [1550566604.7347975, 29, 1.5363272257953886], [1550566604.7380898, 30, 1.5374753309166493], [1550566607.6193054, 31, 1.5385494443596428], [1550566607.622977, 32, 1.5395564933646284], [1550566607.6268091, 33, 1.5405025668761214], [1550566607.6309326, 34, 1.5413930385908916], [1550566607.6350362, 35, 1.5422326689561365], [1550566607.6387522, 36, 1.5430256902014756], [1550566607.6420105, 37, 1.5437758776076318], [1550566607.6453218, 38, 1.5444866095419745], [1550566607.6485894, 39, 1.545160918273219], [1550566607.6518698, 40, 1.5458015331759765], [1550566610.788568, 41, 1.546410917622178], [1550566610.7942996, 42, 1.5469913006098266], [1550566610.800043, 43, 1.5475447039844337], [1550566610.8057463, 44, 1.5480729659532555], [1550566610.8114905, 45, 1.5485777614681775], [1550566610.8176525, 46, 1.5490606199531038], [1550566610.823419, 47, 1.5495229407708355], [1550566610.8292584, 48, 1.5499660067586796], [1550566610.8351147, 49, 1.5503909961083586], [1550566610.8412092, 50, 1.550798992821746], [1550566613.9934998, 51, 1.551190995937692], [1550566613.9987664, 52, 1.5515679276951895], [1550566614.004006, 53, 1.5519306407732258], [1550566614.0092344, 54, 1.5522799247268875], [1550566614.0144439, 55, 1.5526165117219184], [1550566614.019653, 56, 1.5529410816553442], [1550566614.0248625, 57, 1.5532542667374942], [1550566614.0300744, 58, 1.5535566556003668], [1550566614.0352824, 59, 1.5538487969884918], [1550566614.0404866, 60, 1.554131203080956], [1550566617.1852794, 61, 1.5544043524868913], [1550566617.1906264, 62, 1.5546686929512603], [1550566617.1959205, 63, 1.5549246438031066], [1550566617.2012494, 64, 1.5551725981744198], [1550566617.2066007, 65, 1.5554129250143014], [1550566617.211956, 66, 1.555645970920127], [1550566617.2174122, 67, 1.5558720618048116], [1550566617.223191, 68, 1.5560915044170451], [1550566617.2286913, 69, 1.5563045877293966], [1550566617.234499, 70, 1.5565115842075], [1550566620.4757872, 71, 1.5567127509720364], [1550566620.481102, 72, 1.5569083308639295], [1550566620.4864123, 73, 1.5570985534220307], [1550566620.4917448, 74, 1.5572836357815685], [1550566620.4970431, 75, 1.557463783500751], [1550566620.5023334, 76, 1.5576391913221408], [1550566620.507733, 77, 1.5578100438747242], [1550566620.5130665, 78, 1.557976516321996], [1550566620.5184102, 79, 1.5581387749608446], [1550566620.5237374, 80, 1.5582969777755349], [1550566623.7218773, 81, 1.558451274950672], [1550566623.7271514, 82, 1.5586018093466447], [1550566623.7325153, 83, 1.5587487169407106], [1550566623.7378001, 84, 1.5588921272365868], [1550566623.7430358, 85, 1.5590321636451379], [1550566623.7482684, 86, 1.5591689438385128], [1550566623.753504, 87, 1.559302580079866], [1550566623.7587154, 88, 1.5594331795306058], [1550566623.7639425, 89, 1.559560844536934], [1550566623.7691612, 90, 1.5596856728972892], [1550566626.9657416, 91, 1.559807758112163], [1550566626.9710855, 92, 1.5599271896176263], [1550566626.9766364, 93, 1.5600440530037953], [1550566626.982015, 94, 1.5601584302193552], [1550566626.9873207, 95, 1.5602703997631713], [1550566626.9926276, 96, 1.560380036863927], [1550566626.9982402, 97, 1.5604874136486533], [1550566627.0036604, 98, 1.5605925993009424], [1550566627.009098, 99, 1.5606956602095747]]}
\ No newline at end of file
diff --git a/pymic/test/mnist/processed/test.pt b/pymic/test/mnist/processed/test.pt
deleted file mode 100644
index 60e4e68..0000000
Binary files a/pymic/test/mnist/processed/test.pt and /dev/null differ
diff --git a/pymic/test/mnist/processed/training.pt b/pymic/test/mnist/processed/training.pt
deleted file mode 100644
index eda595b..0000000
Binary files a/pymic/test/mnist/processed/training.pt and /dev/null differ
diff --git a/pymic/test/mnist/raw/t10k-images-idx3-ubyte b/pymic/test/mnist/raw/t10k-images-idx3-ubyte
deleted file mode 100644
index 1170b2c..0000000
Binary files a/pymic/test/mnist/raw/t10k-images-idx3-ubyte and /dev/null differ
diff --git a/pymic/test/mnist/raw/t10k-labels-idx1-ubyte b/pymic/test/mnist/raw/t10k-labels-idx1-ubyte
deleted file mode 100644
index d1c3a97..0000000
Binary files a/pymic/test/mnist/raw/t10k-labels-idx1-ubyte and /dev/null differ
diff --git a/pymic/test/mnist/raw/train-images-idx3-ubyte b/pymic/test/mnist/raw/train-images-idx3-ubyte
deleted file mode 100644
index bbce276..0000000
Binary files a/pymic/test/mnist/raw/train-images-idx3-ubyte and /dev/null differ
diff --git a/pymic/test/mnist/raw/train-labels-idx1-ubyte b/pymic/test/mnist/raw/train-labels-idx1-ubyte
deleted file mode 100644
index d6b4c5d..0000000
Binary files a/pymic/test/mnist/raw/train-labels-idx1-ubyte and /dev/null differ
diff --git a/pymic/test/runs/Feb19_16-56-35_uestc-MW50-SV0/00000/default/metadata.tsv b/pymic/test/runs/Feb19_16-56-35_uestc-MW50-SV0/00000/default/metadata.tsv
deleted file mode 100644
index 8144124..0000000
--- a/pymic/test/runs/Feb19_16-56-35_uestc-MW50-SV0/00000/default/metadata.tsv
+++ /dev/null
@@ -1,100 +0,0 @@
-tensor(7)
-tensor(2)
-tensor(1)
-tensor(0)
-tensor(4)
-tensor(1)
-tensor(4)
-tensor(9)
-tensor(5)
-tensor(9)
-tensor(0)
-tensor(6)
-tensor(9)
-tensor(0)
-tensor(1)
-tensor(5)
-tensor(9)
-tensor(7)
-tensor(3)
-tensor(4)
-tensor(9)
-tensor(6)
-tensor(6)
-tensor(5)
-tensor(4)
-tensor(0)
-tensor(7)
-tensor(4)
-tensor(0)
-tensor(1)
-tensor(3)
-tensor(1)
-tensor(3)
-tensor(4)
-tensor(7)
-tensor(2)
-tensor(7)
-tensor(1)
-tensor(2)
-tensor(1)
-tensor(1)
-tensor(7)
-tensor(4)
-tensor(2)
-tensor(3)
-tensor(5)
-tensor(1)
-tensor(2)
-tensor(4)
-tensor(4)
-tensor(6)
-tensor(3)
-tensor(5)
-tensor(5)
-tensor(6)
-tensor(0)
-tensor(4)
-tensor(1)
-tensor(9)
-tensor(5)
-tensor(7)
-tensor(8)
-tensor(9)
-tensor(3)
-tensor(7)
-tensor(4)
-tensor(6)
-tensor(4)
-tensor(3)
-tensor(0)
-tensor(7)
-tensor(0)
-tensor(2)
-tensor(9)
-tensor(1)
-tensor(7)
-tensor(3)
-tensor(2)
-tensor(9)
-tensor(7)
-tensor(7)
-tensor(6)
-tensor(2)
-tensor(7)
-tensor(8)
-tensor(4)
-tensor(7)
-tensor(3)
-tensor(6)
-tensor(1)
-tensor(3)
-tensor(6)
-tensor(9)
-tensor(3)
-tensor(1)
-tensor(4)
-tensor(1)
-tensor(7)
-tensor(6)
-tensor(9)
diff --git a/pymic/test/runs/Feb19_16-56-35_uestc-MW50-SV0/00000/default/sprite.png b/pymic/test/runs/Feb19_16-56-35_uestc-MW50-SV0/00000/default/sprite.png
deleted file mode 100644
index 129284d..0000000
Binary files a/pymic/test/runs/Feb19_16-56-35_uestc-MW50-SV0/00000/default/sprite.png and /dev/null differ
diff --git a/pymic/test/runs/Feb19_16-56-35_uestc-MW50-SV0/00000/default/tensors.tsv b/pymic/test/runs/Feb19_16-56-35_uestc-MW50-SV0/00000/default/tensors.tsv
deleted file mode 100644
index f0c6e15..0000000
--- a/pymic/test/runs/Feb19_16-56-35_uestc-MW50-SV0/00000/default/tensors.tsv
+++ /dev/null
@@ -1,100 +0,0 @@
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 84.0 185.0 159.0 151.0 60.0 36.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 222.0 254.0 254.0 254.0 254.0 241.0 198.0 198.0 198.0 198.0 198.0 198.0 198.0 198.0 170.0 52.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 67.0 114.0 72.0 114.0 163.0 227.0 254.0 225.0 254.0 254.0 254.0 250.0 229.0 254.0 254.0 140.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 17.0 66.0 14.0 67.0 67.0 67.0 59.0 21.0 236.0 254.0 106.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 83.0 253.0 209.0 18.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 22.0 233.0 255.0 83.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 129.0 254.0 238.0 44.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 59.0 249.0 254.0 62.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 133.0 254.0 187.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 9.0 205.0 248.0 58.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 126.0 254.0 182.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 75.0 251.0 240.0 57.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 19.0 221.0 254.0 166.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 203.0 254.0 219.0 35.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 38.0 254.0 254.0 77.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 31.0 224.0 254.0 115.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 133.0 254.0 254.0 52.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 61.0 242.0 254.0 254.0 52.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 121.0 254.0 254.0 219.0 40.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 121.0 254.0 207.0 18.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 116.0 125.0 171.0 255.0 255.0 150.0 93.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 169.0 253.0 253.0 253.0 253.0 253.0 253.0 218.0 30.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 169.0 253.0 253.0 253.0 213.0 142.0 176.0 253.0 253.0 122.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 52.0 250.0 253.0 210.0 32.0 12.0 0.0 6.0 206.0 253.0 140.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 77.0 251.0 210.0 25.0 0.0 0.0 0.0 122.0 248.0 253.0 65.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 31.0 18.0 0.0 0.0 0.0 0.0 209.0 253.0 253.0 65.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 117.0 247.0 253.0 198.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 76.0 247.0 253.0 231.0 63.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 253.0 253.0 144.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 176.0 246.0 253.0 159.0 12.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 25.0 234.0 253.0 233.0 35.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 198.0 253.0 253.0 141.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 78.0 248.0 253.0 189.0 12.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 19.0 200.0 253.0 253.0 141.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 134.0 253.0 253.0 173.0 12.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 248.0 253.0 253.0 25.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 248.0 253.0 253.0 43.0 20.0 20.0 20.0 20.0 5.0 0.0 5.0 20.0 20.0 37.0 150.0 150.0 150.0 147.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 248.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 168.0 143.0 166.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 123.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 174.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 249.0 247.0 247.0 169.0 117.0 117.0 57.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 118.0 123.0 123.0 123.0 166.0 253.0 253.0 253.0 155.0 123.0 123.0 41.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 38.0 254.0 109.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 87.0 252.0 82.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 135.0 241.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 45.0 244.0 150.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 84.0 254.0 63.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 202.0 223.0 11.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 32.0 254.0 216.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 95.0 254.0 195.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 140.0 254.0 77.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 57.0 237.0 205.0 8.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 124.0 255.0 165.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 171.0 254.0 81.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 24.0 232.0 215.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 120.0 254.0 159.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 151.0 254.0 142.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 228.0 254.0 66.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 61.0 251.0 254.0 66.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 141.0 254.0 205.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 10.0 215.0 254.0 121.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 198.0 176.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 150.0 253.0 202.0 31.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 37.0 251.0 251.0 253.0 107.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 197.0 251.0 251.0 253.0 107.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 110.0 190.0 251.0 251.0 251.0 253.0 169.0 109.0 62.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 253.0 251.0 251.0 251.0 251.0 253.0 251.0 251.0 220.0 51.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 182.0 255.0 253.0 253.0 253.0 253.0 234.0 222.0 253.0 253.0 253.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 63.0 221.0 253.0 251.0 251.0 251.0 147.0 77.0 62.0 128.0 251.0 251.0 105.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 32.0 231.0 251.0 253.0 251.0 220.0 137.0 10.0 0.0 0.0 31.0 230.0 251.0 243.0 113.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 37.0 251.0 251.0 253.0 188.0 20.0 0.0 0.0 0.0 0.0 0.0 109.0 251.0 253.0 251.0 35.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 37.0 251.0 251.0 201.0 30.0 0.0 0.0 0.0 0.0 0.0 0.0 31.0 200.0 253.0 251.0 35.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 37.0 253.0 253.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 32.0 202.0 255.0 253.0 164.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 140.0 251.0 251.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 109.0 251.0 253.0 251.0 35.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 217.0 251.0 251.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 63.0 231.0 251.0 253.0 230.0 30.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 217.0 251.0 251.0 0.0 0.0 0.0 0.0 0.0 0.0 144.0 251.0 251.0 251.0 221.0 61.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 217.0 251.0 251.0 0.0 0.0 0.0 0.0 0.0 182.0 221.0 251.0 251.0 251.0 180.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 218.0 253.0 253.0 73.0 73.0 228.0 253.0 253.0 255.0 253.0 253.0 253.0 253.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 113.0 251.0 251.0 253.0 251.0 251.0 251.0 251.0 253.0 251.0 251.0 251.0 147.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 31.0 230.0 251.0 253.0 251.0 251.0 251.0 251.0 253.0 230.0 189.0 35.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 62.0 142.0 253.0 251.0 251.0 251.0 251.0 253.0 107.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 72.0 174.0 251.0 173.0 71.0 72.0 30.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 50.0 224.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 70.0 29.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 121.0 231.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 148.0 168.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 195.0 231.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 96.0 210.0 11.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 69.0 252.0 134.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 114.0 252.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 45.0 236.0 217.0 12.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 192.0 252.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 168.0 247.0 53.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 18.0 255.0 253.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 84.0 242.0 211.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 141.0 253.0 189.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 169.0 252.0 106.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 32.0 232.0 250.0 66.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 15.0 225.0 252.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 134.0 252.0 211.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 22.0 252.0 164.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 169.0 252.0 167.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 9.0 204.0 209.0 18.0 0.0 0.0 0.0 0.0 0.0 0.0 22.0 253.0 253.0 107.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 169.0 252.0 199.0 85.0 85.0 85.0 85.0 129.0 164.0 195.0 252.0 252.0 106.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 41.0 170.0 245.0 252.0 252.0 252.0 252.0 232.0 231.0 251.0 252.0 252.0 9.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 49.0 84.0 84.0 84.0 84.0 0.0 0.0 161.0 252.0 252.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 127.0 252.0 252.0 45.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 253.0 253.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 127.0 252.0 252.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 135.0 252.0 244.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 232.0 236.0 111.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 179.0 66.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 77.0 254.0 107.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 19.0 227.0 254.0 254.0 9.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 81.0 254.0 254.0 165.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 7.0 203.0 254.0 254.0 73.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 53.0 254.0 254.0 250.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 134.0 254.0 254.0 180.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 196.0 254.0 248.0 48.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 58.0 254.0 254.0 237.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 111.0 254.0 254.0 132.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 163.0 254.0 238.0 28.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 60.0 252.0 254.0 223.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 79.0 254.0 254.0 154.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 163.0 254.0 238.0 53.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 28.0 252.0 254.0 210.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 86.0 254.0 254.0 131.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 105.0 254.0 234.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 175.0 254.0 204.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 211.0 254.0 196.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 158.0 254.0 160.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 26.0 157.0 107.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 22.0 192.0 134.0 32.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 15.0 77.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 17.0 235.0 250.0 169.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 15.0 220.0 241.0 37.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 20.0 189.0 253.0 147.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 139.0 253.0 100.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 70.0 253.0 253.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 43.0 254.0 173.0 13.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 22.0 153.0 253.0 96.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 43.0 231.0 254.0 92.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 163.0 255.0 204.0 11.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 104.0 254.0 158.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 162.0 253.0 178.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 9.0 131.0 237.0 253.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 162.0 253.0 253.0 191.0 175.0 70.0 70.0 70.0 70.0 133.0 197.0 253.0 253.0 169.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 51.0 228.0 253.0 253.0 254.0 253.0 253.0 253.0 253.0 254.0 253.0 253.0 219.0 35.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 17.0 65.0 137.0 254.0 232.0 137.0 137.0 137.0 44.0 253.0 253.0 161.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 34.0 254.0 206.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 160.0 253.0 69.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 85.0 254.0 241.0 50.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 158.0 254.0 165.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 231.0 244.0 50.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 104.0 254.0 232.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 208.0 253.0 157.0 0.0 13.0 30.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 208.0 253.0 154.0 91.0 204.0 161.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 208.0 253.0 254.0 253.0 154.0 29.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 61.0 190.0 128.0 23.0 6.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 14.0 149.0 193.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 91.0 224.0 253.0 253.0 19.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 28.0 235.0 254.0 253.0 253.0 166.0 18.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 144.0 253.0 254.0 253.0 253.0 253.0 238.0 115.0 6.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 31.0 241.0 253.0 208.0 185.0 253.0 253.0 253.0 231.0 24.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 79.0 254.0 193.0 0.0 8.0 98.0 219.0 254.0 255.0 201.0 18.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 86.0 253.0 80.0 0.0 0.0 0.0 182.0 253.0 254.0 191.0 12.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 175.0 253.0 155.0 0.0 0.0 0.0 234.0 253.0 254.0 135.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 86.0 253.0 208.0 40.0 85.0 166.0 251.0 237.0 254.0 236.0 42.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 18.0 238.0 253.0 254.0 253.0 253.0 185.0 36.0 216.0 253.0 152.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 68.0 240.0 255.0 254.0 145.0 8.0 0.0 134.0 254.0 223.0 35.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 68.0 158.0 142.0 12.0 0.0 0.0 9.0 175.0 253.0 161.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 88.0 253.0 226.0 18.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 166.0 253.0 126.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 48.0 245.0 253.0 38.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 115.0 254.0 172.0 9.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 218.0 254.0 46.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 30.0 254.0 165.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 186.0 244.0 42.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 14.0 223.0 78.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 17.0 47.0 47.0 47.0 16.0 129.0 85.0 47.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 75.0 153.0 217.0 253.0 253.0 253.0 215.0 246.0 253.0 253.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 35.0 142.0 244.0 252.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 63.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 213.0 170.0 170.0 170.0 170.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 20.0 132.0 72.0 0.0 57.0 238.0 227.0 238.0 168.0 124.0 69.0 20.0 11.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 206.0 253.0 78.0 0.0 0.0 32.0 0.0 30.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 177.0 253.0 132.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 12.0 133.0 253.0 233.0 15.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 92.0 253.0 223.0 28.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 150.0 253.0 174.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 234.0 253.0 246.0 127.0 49.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 253.0 253.0 253.0 251.0 147.0 91.0 121.0 85.0 42.0 42.0 85.0 28.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 139.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 232.0 168.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 53.0 218.0 222.0 251.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 252.0 124.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 67.0 72.0 200.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 175.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 120.0 253.0 249.0 152.0 51.0 164.0 253.0 253.0 175.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 50.0 253.0 253.0 253.0 188.0 252.0 253.0 253.0 148.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 9.0 167.0 253.0 253.0 253.0 253.0 250.0 175.0 11.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 23.0 180.0 231.0 253.0 221.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 93.0 149.0 22.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 36.0 56.0 137.0 201.0 199.0 95.0 37.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 45.0 152.0 234.0 254.0 254.0 254.0 254.0 254.0 250.0 211.0 151.0 6.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 46.0 153.0 240.0 254.0 254.0 227.0 166.0 133.0 251.0 200.0 254.0 229.0 225.0 104.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 153.0 234.0 254.0 254.0 187.0 142.0 8.0 0.0 0.0 191.0 40.0 198.0 246.0 223.0 253.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 8.0 126.0 253.0 254.0 233.0 128.0 11.0 0.0 0.0 0.0 0.0 210.0 43.0 70.0 254.0 254.0 254.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 72.0 243.0 254.0 228.0 54.0 0.0 0.0 0.0 0.0 3.0 32.0 116.0 225.0 242.0 254.0 255.0 162.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 75.0 240.0 254.0 223.0 109.0 138.0 178.0 178.0 169.0 210.0 251.0 231.0 254.0 254.0 254.0 232.0 38.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 9.0 175.0 244.0 253.0 255.0 254.0 254.0 251.0 254.0 254.0 254.0 254.0 254.0 252.0 171.0 25.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 16.0 136.0 195.0 176.0 146.0 153.0 200.0 254.0 254.0 254.0 254.0 150.0 16.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 162.0 254.0 254.0 241.0 99.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 118.0 250.0 254.0 254.0 90.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 100.0 242.0 254.0 254.0 211.0 7.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 54.0 241.0 254.0 254.0 242.0 59.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 131.0 254.0 254.0 244.0 64.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 13.0 249.0 254.0 254.0 152.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 12.0 228.0 254.0 254.0 208.0 8.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 78.0 255.0 254.0 254.0 66.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 209.0 254.0 254.0 137.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 227.0 255.0 233.0 25.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 113.0 255.0 108.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 61.0 3.0 42.0 118.0 193.0 118.0 118.0 61.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 14.0 179.0 245.0 236.0 242.0 254.0 254.0 254.0 254.0 245.0 235.0 84.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 151.0 254.0 254.0 254.0 213.0 192.0 178.0 178.0 180.0 254.0 254.0 241.0 46.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 43.0 235.0 254.0 226.0 64.0 28.0 12.0 0.0 0.0 2.0 128.0 252.0 255.0 173.0 17.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 56.0 254.0 253.0 107.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 134.0 250.0 254.0 75.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 63.0 254.0 158.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 221.0 254.0 157.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 194.0 254.0 103.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 150.0 254.0 213.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 34.0 220.0 239.0 58.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 84.0 254.0 213.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 126.0 254.0 171.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 84.0 254.0 213.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 214.0 239.0 60.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 84.0 254.0 213.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 214.0 199.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 84.0 254.0 213.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 219.0 199.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 84.0 254.0 213.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 98.0 254.0 199.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 162.0 254.0 209.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 98.0 254.0 199.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 51.0 238.0 254.0 75.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 98.0 254.0 199.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 51.0 165.0 254.0 195.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 66.0 241.0 199.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 167.0 254.0 227.0 55.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 214.0 213.0 20.0 0.0 0.0 0.0 0.0 0.0 46.0 152.0 202.0 254.0 254.0 63.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 214.0 254.0 204.0 180.0 180.0 180.0 180.0 180.0 235.0 254.0 254.0 234.0 156.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 81.0 205.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 252.0 234.0 120.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 26.0 210.0 254.0 254.0 254.0 254.0 254.0 153.0 104.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 7.0 204.0 253.0 176.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 7.0 150.0 252.0 252.0 125.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 117.0 252.0 186.0 56.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 141.0 252.0 118.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 154.0 247.0 50.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 26.0 253.0 196.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 150.0 253.0 196.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 57.0 85.0 85.0 38.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 225.0 253.0 96.0 0.0 0.0 0.0 0.0 0.0 151.0 226.0 243.0 252.0 252.0 238.0 125.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 10.0 229.0 226.0 0.0 0.0 0.0 4.0 54.0 229.0 253.0 255.0 234.0 175.0 225.0 255.0 228.0 31.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 110.0 252.0 150.0 0.0 0.0 26.0 128.0 252.0 252.0 227.0 134.0 28.0 0.0 0.0 178.0 252.0 56.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 159.0 252.0 113.0 0.0 0.0 150.0 253.0 252.0 186.0 43.0 0.0 0.0 0.0 0.0 141.0 252.0 56.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 185.0 252.0 113.0 0.0 38.0 237.0 253.0 151.0 6.0 0.0 0.0 0.0 0.0 0.0 141.0 202.0 6.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 198.0 253.0 114.0 0.0 147.0 253.0 163.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 154.0 197.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 197.0 252.0 113.0 0.0 172.0 252.0 188.0 0.0 0.0 0.0 0.0 0.0 0.0 26.0 253.0 171.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 197.0 252.0 113.0 0.0 19.0 231.0 247.0 122.0 19.0 0.0 0.0 0.0 0.0 200.0 244.0 56.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 26.0 222.0 252.0 113.0 0.0 0.0 25.0 203.0 252.0 193.0 13.0 0.0 76.0 200.0 249.0 125.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 185.0 253.0 179.0 10.0 0.0 0.0 0.0 76.0 35.0 29.0 154.0 253.0 244.0 125.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 28.0 209.0 253.0 196.0 82.0 57.0 57.0 131.0 197.0 252.0 253.0 214.0 81.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 25.0 216.0 252.0 252.0 252.0 253.0 252.0 252.0 252.0 156.0 19.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 16.0 103.0 139.0 240.0 140.0 139.0 139.0 40.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 49.0 180.0 253.0 255.0 253.0 169.0 36.0 11.0 76.0 9.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 68.0 228.0 252.0 252.0 253.0 252.0 252.0 160.0 189.0 253.0 92.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 55.0 252.0 252.0 227.0 79.0 69.0 69.0 100.0 90.0 236.0 247.0 67.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 43.0 233.0 252.0 185.0 50.0 0.0 0.0 0.0 26.0 203.0 252.0 135.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 168.0 253.0 178.0 37.0 0.0 0.0 0.0 0.0 70.0 252.0 252.0 63.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 155.0 253.0 242.0 42.0 0.0 0.0 0.0 0.0 5.0 191.0 253.0 190.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 207.0 252.0 230.0 0.0 0.0 0.0 0.0 5.0 136.0 252.0 252.0 64.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 207.0 252.0 230.0 0.0 0.0 0.0 32.0 138.0 252.0 252.0 227.0 16.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 165.0 252.0 249.0 207.0 207.0 207.0 228.0 253.0 252.0 252.0 160.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 9.0 179.0 253.0 252.0 252.0 252.0 252.0 75.0 169.0 252.0 56.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 116.0 116.0 74.0 0.0 149.0 253.0 215.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 253.0 252.0 162.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 32.0 253.0 240.0 50.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 157.0 253.0 164.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 43.0 240.0 253.0 92.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 93.0 253.0 252.0 84.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 114.0 252.0 209.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 207.0 252.0 116.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 165.0 252.0 116.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 93.0 200.0 63.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 17.0 66.0 138.0 255.0 253.0 169.0 138.0 23.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 120.0 228.0 252.0 252.0 253.0 252.0 252.0 252.0 158.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 108.0 252.0 252.0 252.0 252.0 190.0 252.0 252.0 252.0 252.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 43.0 233.0 252.0 252.0 252.0 116.0 5.0 135.0 252.0 252.0 252.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 43.0 178.0 253.0 252.0 221.0 43.0 2.0 0.0 5.0 54.0 232.0 252.0 210.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 93.0 253.0 255.0 249.0 115.0 0.0 0.0 0.0 0.0 0.0 136.0 251.0 255.0 154.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 166.0 252.0 253.0 185.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 209.0 253.0 206.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 19.0 220.0 252.0 253.0 92.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 116.0 253.0 206.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 70.0 252.0 252.0 192.0 17.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 116.0 253.0 223.0 25.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 122.0 252.0 252.0 63.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 116.0 253.0 252.0 69.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 132.0 253.0 253.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 116.0 255.0 253.0 69.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 184.0 252.0 252.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 116.0 253.0 252.0 69.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 184.0 252.0 252.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 116.0 253.0 240.0 50.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 184.0 252.0 252.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 210.0 253.0 112.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 48.0 232.0 252.0 158.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 230.0 232.0 8.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 93.0 253.0 244.0 50.0 0.0 0.0 0.0 0.0 0.0 0.0 155.0 253.0 168.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 34.0 164.0 253.0 113.0 0.0 0.0 0.0 0.0 0.0 66.0 236.0 231.0 42.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 32.0 222.0 240.0 134.0 0.0 0.0 38.0 91.0 234.0 252.0 137.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 25.0 177.0 240.0 207.0 103.0 233.0 252.0 252.0 176.0 35.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 15.0 54.0 179.0 252.0 137.0 137.0 54.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 255.0 191.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 191.0 255.0 255.0 64.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 255.0 255.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 255.0 255.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 255.0 255.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 255.0 255.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 255.0 255.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 255.0 255.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 255.0 255.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 255.0 255.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 255.0 255.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 255.0 255.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 255.0 255.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 255.0 255.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 191.0 255.0 255.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 191.0 255.0 255.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 255.0 255.0 255.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 191.0 255.0 255.0 255.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 255.0 255.0 255.0 64.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 255.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 51.0 132.0 214.0 253.0 254.0 253.0 203.0 162.0 41.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 102.0 142.0 203.0 203.0 253.0 252.0 253.0 252.0 151.0 70.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 253.0 244.0 203.0 142.0 102.0 82.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 172.0 252.0 203.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 223.0 234.0 30.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 122.0 253.0 50.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 123.0 254.0 91.0 51.0 51.0 51.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 223.0 253.0 252.0 253.0 252.0 253.0 172.0 82.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 214.0 253.0 203.0 162.0 102.0 102.0 203.0 223.0 254.0 253.0 51.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 61.0 253.0 171.0 0.0 0.0 0.0 0.0 0.0 20.0 112.0 192.0 253.0 212.0 41.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 102.0 203.0 234.0 51.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 20.0 213.0 232.0 82.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 62.0 203.0 234.0 112.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 20.0 213.0 252.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 153.0 253.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 41.0 233.0 212.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 113.0 92.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 31.0 173.0 244.0 40.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 82.0 253.0 151.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 102.0 102.0 183.0 233.0 212.0 81.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 82.0 255.0 253.0 234.0 152.0 153.0 193.0 173.0 253.0 254.0 253.0 254.0 213.0 142.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 71.0 151.0 151.0 232.0 253.0 212.0 192.0 151.0 131.0 50.0 50.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 146.0 229.0 255.0 205.0 120.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 24.0 198.0 252.0 253.0 225.0 216.0 235.0 252.0 89.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 20.0 205.0 253.0 223.0 70.0 15.0 0.0 29.0 206.0 174.0 2.0 87.0 38.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 137.0 253.0 227.0 6.0 0.0 0.0 0.0 0.0 35.0 28.0 76.0 253.0 253.0 9.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 88.0 251.0 235.0 12.0 0.0 0.0 0.0 0.0 0.0 0.0 42.0 238.0 253.0 174.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 134.0 253.0 192.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 14.0 238.0 253.0 161.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 169.0 253.0 74.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 85.0 247.0 253.0 75.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 10.0 250.0 253.0 47.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 219.0 253.0 241.0 31.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 10.0 253.0 253.0 47.0 0.0 0.0 0.0 0.0 0.0 5.0 72.0 253.0 253.0 143.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 221.0 253.0 117.0 0.0 0.0 0.0 0.0 25.0 118.0 253.0 253.0 253.0 47.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 28.0 242.0 254.0 187.0 104.0 146.0 159.0 220.0 244.0 239.0 254.0 224.0 18.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 78.0 201.0 253.0 253.0 248.0 215.0 156.0 67.0 247.0 253.0 157.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 56.0 56.0 50.0 0.0 0.0 38.0 253.0 253.0 74.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 66.0 253.0 253.0 18.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 149.0 253.0 253.0 18.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 30.0 238.0 253.0 191.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 66.0 253.0 253.0 112.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 87.0 253.0 244.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 170.0 253.0 198.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 253.0 149.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 74.0 249.0 254.0 254.0 254.0 245.0 167.0 167.0 136.0 25.0 80.0 60.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 104.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 249.0 254.0 252.0 197.0 113.0 71.0 39.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 99.0 135.0 105.0 105.0 114.0 192.0 192.0 192.0 233.0 254.0 254.0 254.0 254.0 254.0 246.0 129.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 45.0 114.0 114.0 203.0 254.0 254.0 254.0 240.0 15.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 8.0 35.0 155.0 254.0 254.0 130.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 36.0 254.0 241.0 34.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 115.0 254.0 254.0 118.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 34.0 243.0 254.0 240.0 17.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 111.0 254.0 254.0 139.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 37.0 243.0 254.0 244.0 40.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 20.0 176.0 254.0 254.0 113.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 140.0 254.0 254.0 220.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 88.0 253.0 254.0 243.0 45.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 63.0 241.0 254.0 254.0 83.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 16.0 243.0 254.0 254.0 147.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 111.0 254.0 254.0 203.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 58.0 254.0 254.0 254.0 84.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 14.0 237.0 254.0 255.0 194.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 82.0 254.0 254.0 194.0 27.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 39.0 230.0 193.0 28.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 12.0 41.0 146.0 146.0 48.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 12.0 129.0 253.0 253.0 253.0 250.0 163.0 18.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 133.0 253.0 253.0 253.0 253.0 253.0 253.0 229.0 70.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 101.0 253.0 252.0 145.0 102.0 107.0 237.0 253.0 247.0 128.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 181.0 253.0 167.0 0.0 0.0 0.0 61.0 235.0 253.0 253.0 163.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 253.0 43.0 0.0 0.0 0.0 0.0 58.0 193.0 253.0 253.0 164.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 187.0 253.0 32.0 0.0 0.0 0.0 0.0 0.0 55.0 236.0 253.0 253.0 86.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 146.0 253.0 32.0 0.0 100.0 190.0 87.0 87.0 87.0 147.0 253.0 253.0 123.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 94.0 253.0 78.0 40.0 248.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 223.0 84.0 15.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 14.0 92.0 12.0 35.0 240.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 244.0 89.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 75.0 161.0 179.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 209.0 43.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 16.0 16.0 39.0 38.0 16.0 16.0 145.0 243.0 253.0 253.0 185.0 48.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 20.0 58.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 58.0 209.0 253.0 253.0 183.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 77.0 221.0 247.0 79.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 13.0 219.0 253.0 240.0 72.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 90.0 247.0 253.0 252.0 57.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 53.0 251.0 253.0 191.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 116.0 253.0 253.0 59.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 99.0 252.0 253.0 145.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 14.0 188.0 253.0 221.0 158.0 38.0 0.0 0.0 0.0 0.0 111.0 211.0 246.0 253.0 253.0 145.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 12.0 221.0 246.0 253.0 251.0 249.0 249.0 249.0 249.0 253.0 253.0 253.0 253.0 200.0 19.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 95.0 183.0 228.0 253.0 253.0 253.0 253.0 253.0 253.0 195.0 124.0 23.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 24.0 37.0 138.0 74.0 126.0 88.0 37.0 7.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 168.0 91.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 234.0 126.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 51.0 254.0 126.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 38.0 178.0 31.0 0.0 0.0 0.0 0.0 0.0 51.0 254.0 81.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 94.0 254.0 83.0 0.0 0.0 0.0 0.0 0.0 87.0 254.0 54.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 160.0 254.0 56.0 0.0 0.0 0.0 0.0 0.0 189.0 238.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 13.0 227.0 168.0 2.0 0.0 0.0 0.0 0.0 0.0 194.0 236.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 55.0 254.0 114.0 0.0 0.0 0.0 0.0 0.0 16.0 235.0 167.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 115.0 254.0 50.0 0.0 0.0 0.0 0.0 0.0 103.0 254.0 105.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 7.0 221.0 236.0 75.0 156.0 180.0 190.0 252.0 252.0 253.0 254.0 114.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 15.0 254.0 254.0 254.0 252.0 211.0 179.0 179.0 179.0 246.0 254.0 247.0 94.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 8.0 217.0 239.0 117.0 22.0 0.0 0.0 0.0 0.0 226.0 254.0 242.0 197.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 14.0 18.0 0.0 0.0 0.0 0.0 0.0 27.0 243.0 207.0 46.0 37.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 99.0 254.0 132.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 116.0 254.0 67.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 116.0 254.0 61.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 116.0 254.0 61.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 174.0 255.0 100.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 187.0 254.0 83.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 115.0 176.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 31.0 140.0 193.0 44.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 38.0 146.0 240.0 254.0 254.0 228.0 48.0 77.0 46.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 43.0 230.0 254.0 254.0 254.0 254.0 254.0 241.0 254.0 197.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 130.0 254.0 254.0 254.0 239.0 252.0 254.0 254.0 254.0 254.0 237.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 154.0 254.0 254.0 249.0 104.0 71.0 198.0 254.0 254.0 254.0 234.0 57.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 173.0 252.0 252.0 206.0 51.0 120.0 215.0 254.0 254.0 254.0 254.0 184.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 112.0 254.0 254.0 215.0 87.0 247.0 254.0 254.0 254.0 254.0 254.0 217.0 31.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 231.0 254.0 254.0 254.0 254.0 254.0 236.0 128.0 196.0 254.0 254.0 119.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 197.0 254.0 254.0 245.0 238.0 131.0 17.0 46.0 247.0 254.0 199.0 14.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 16.0 92.0 88.0 40.0 0.0 0.0 12.0 173.0 254.0 242.0 38.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 95.0 254.0 254.0 155.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 18.0 210.0 254.0 225.0 6.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 197.0 254.0 254.0 99.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 34.0 242.0 254.0 179.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 27.0 223.0 254.0 225.0 30.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 77.0 254.0 255.0 127.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 54.0 238.0 254.0 248.0 53.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 183.0 254.0 254.0 231.0 41.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 113.0 254.0 254.0 230.0 48.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 110.0 239.0 126.0 25.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 49.0 180.0 253.0 244.0 50.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 184.0 252.0 252.0 232.0 164.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 66.0 234.0 252.0 136.0 38.0 56.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 19.0 236.0 252.0 176.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 76.0 252.0 252.0 56.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 139.0 253.0 173.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 22.0 212.0 252.0 69.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 116.0 253.0 240.0 50.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 157.0 253.0 206.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 230.0 253.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 231.0 255.0 180.0 138.0 180.0 253.0 255.0 253.0 222.0 97.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 230.0 253.0 252.0 252.0 252.0 252.0 211.0 252.0 252.0 252.0 117.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 230.0 253.0 240.0 183.0 89.0 69.0 7.0 69.0 171.0 252.0 252.0 85.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 135.0 253.0 153.0 0.0 0.0 0.0 0.0 0.0 13.0 215.0 252.0 116.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 116.0 253.0 206.0 0.0 0.0 0.0 0.0 0.0 0.0 155.0 252.0 116.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 106.0 255.0 211.0 7.0 0.0 0.0 0.0 0.0 49.0 233.0 253.0 116.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 159.0 252.0 154.0 9.0 0.0 0.0 30.0 197.0 252.0 252.0 95.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 17.0 227.0 252.0 154.0 70.0 81.0 228.0 252.0 227.0 130.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 50.0 227.0 252.0 252.0 253.0 252.0 185.0 50.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 48.0 179.0 252.0 190.0 117.0 6.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 114.0 255.0 57.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 226.0 255.0 57.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 29.0 255.0 114.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 114.0 255.0 86.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 198.0 255.0 29.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 29.0 255.0 226.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 141.0 255.0 141.0 0.0 0.0 0.0 0.0 0.0 0.0 57.0 86.0 86.0 141.0 57.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 170.0 255.0 86.0 0.0 0.0 0.0 0.0 0.0 57.0 226.0 255.0 255.0 255.0 255.0 57.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 170.0 255.0 86.0 0.0 0.0 0.0 0.0 0.0 170.0 255.0 255.0 114.0 57.0 226.0 198.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 170.0 255.0 86.0 0.0 0.0 0.0 0.0 57.0 255.0 255.0 86.0 0.0 0.0 170.0 255.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 170.0 255.0 86.0 0.0 0.0 0.0 0.0 170.0 255.0 86.0 0.0 0.0 0.0 170.0 255.0 86.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 141.0 255.0 114.0 0.0 0.0 0.0 29.0 255.0 198.0 0.0 0.0 0.0 0.0 170.0 255.0 86.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 29.0 255.0 255.0 0.0 0.0 0.0 170.0 255.0 114.0 0.0 0.0 0.0 0.0 198.0 226.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 198.0 255.0 114.0 0.0 0.0 170.0 255.0 86.0 0.0 0.0 0.0 86.0 255.0 114.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 86.0 255.0 255.0 170.0 57.0 255.0 255.0 29.0 0.0 0.0 86.0 226.0 226.0 29.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 114.0 226.0 255.0 255.0 255.0 255.0 86.0 86.0 170.0 255.0 255.0 57.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 29.0 141.0 255.0 255.0 255.0 255.0 255.0 255.0 198.0 29.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 226.0 255.0 255.0 141.0 86.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 141.0 255.0 255.0 170.0 170.0 57.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 141.0 226.0 170.0 114.0 29.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 69.0 152.0 237.0 254.0 254.0 255.0 254.0 252.0 52.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 87.0 164.0 237.0 253.0 254.0 218.0 138.0 83.0 39.0 154.0 254.0 135.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 138.0 246.0 253.0 254.0 216.0 167.0 54.0 5.0 0.0 0.0 0.0 100.0 191.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 233.0 254.0 169.0 53.0 6.0 0.0 0.0 0.0 0.0 0.0 0.0 35.0 8.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 174.0 254.0 94.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 38.0 245.0 221.0 13.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 142.0 254.0 149.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 151.0 254.0 112.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 226.0 242.0 32.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 12.0 240.0 203.0 44.0 44.0 44.0 44.0 8.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 70.0 254.0 254.0 254.0 254.0 254.0 254.0 205.0 85.0 8.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 37.0 184.0 169.0 133.0 133.0 162.0 212.0 254.0 254.0 166.0 8.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 9.0 51.0 177.0 254.0 125.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 27.0 209.0 254.0 104.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 63.0 209.0 254.0 194.0 13.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 0.0 10.0 137.0 244.0 254.0 198.0 52.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 13.0 87.0 122.0 147.0 223.0 254.0 247.0 127.0 13.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 118.0 250.0 210.0 248.0 254.0 252.0 199.0 49.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 138.0 254.0 254.0 254.0 250.0 201.0 72.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 79.0 167.0 197.0 87.0 7.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 197.0 60.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 50.0 243.0 42.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 186.0 236.0 21.0 0.0 0.0 0.0 134.0 83.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 88.0 213.0 26.0 0.0 0.0 0.0 0.0 129.0 170.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 120.0 0.0 0.0 0.0 0.0 0.0 91.0 209.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 32.0 234.0 112.0 0.0 0.0 0.0 0.0 0.0 91.0 242.0 30.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 116.0 222.0 21.0 0.0 0.0 0.0 0.0 0.0 170.0 244.0 58.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 30.0 240.0 124.0 0.0 0.0 0.0 0.0 0.0 40.0 249.0 138.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 127.0 241.0 18.0 0.0 0.0 0.0 0.0 0.0 15.0 230.0 134.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 16.0 254.0 179.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 165.0 134.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 9.0 191.0 233.0 136.0 101.0 20.0 0.0 0.0 0.0 0.0 113.0 215.0 31.0 31.0 31.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 8.0 89.0 128.0 194.0 218.0 210.0 210.0 211.0 210.0 226.0 254.0 254.0 204.0 120.0 7.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 10.0 15.0 37.0 90.0 90.0 196.0 241.0 34.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 165.0 233.0 16.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 165.0 143.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 91.0 188.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 91.0 233.0 34.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 20.0 254.0 61.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 209.0 219.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 107.0 166.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 80.0 195.0 85.0 80.0 80.0 80.0 14.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 9.0 253.0 253.0 253.0 253.0 253.0 253.0 152.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 62.0 56.0 0.0 9.0 253.0 253.0 253.0 253.0 253.0 253.0 251.0 237.0 57.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 141.0 253.0 241.0 83.0 4.0 161.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 60.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 141.0 248.0 253.0 253.0 147.0 0.0 73.0 209.0 252.0 253.0 253.0 253.0 253.0 253.0 212.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 147.0 253.0 253.0 253.0 253.0 199.0 34.0 0.0 0.0 160.0 253.0 142.0 194.0 253.0 253.0 244.0 77.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 9.0 136.0 250.0 253.0 253.0 253.0 253.0 253.0 69.0 0.0 0.0 15.0 52.0 5.0 27.0 201.0 253.0 253.0 156.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 80.0 253.0 253.0 253.0 253.0 253.0 253.0 209.0 41.0 0.0 0.0 0.0 0.0 0.0 0.0 36.0 253.0 253.0 196.0 33.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 86.0 253.0 253.0 253.0 253.0 253.0 234.0 41.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 42.0 253.0 253.0 253.0 78.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 253.0 253.0 253.0 253.0 253.0 165.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 211.0 253.0 253.0 253.0 78.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 253.0 253.0 253.0 253.0 172.0 18.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 211.0 253.0 253.0 253.0 78.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 253.0 253.0 253.0 210.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 42.0 229.0 246.0 252.0 253.0 253.0 159.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 253.0 253.0 253.0 209.0 0.0 0.0 0.0 0.0 0.0 99.0 149.0 210.0 253.0 253.0 253.0 253.0 242.0 65.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 253.0 253.0 253.0 218.0 53.0 53.0 53.0 180.0 228.0 244.0 253.0 253.0 253.0 253.0 253.0 253.0 77.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 163.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 193.0 29.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 80.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 234.0 193.0 24.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 44.0 210.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 229.0 67.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 38.0 228.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 248.0 235.0 65.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 39.0 210.0 253.0 253.0 253.0 253.0 253.0 253.0 189.0 114.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 43.0 108.0 253.0 253.0 179.0 78.0 78.0 27.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 0.0 0.0 0.0 11.0 92.0 173.0 253.0 254.0 253.0 254.0 253.0 62.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 142.0 0.0 21.0 102.0 213.0 252.0 233.0 151.0 131.0 131.0 253.0 252.0 142.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 163.0 152.0 152.0 214.0 233.0 183.0 102.0 0.0 0.0 0.0 0.0 132.0 253.0 255.0 50.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 82.0 243.0 253.0 252.0 131.0 30.0 0.0 0.0 0.0 0.0 0.0 0.0 10.0 212.0 253.0 131.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 123.0 203.0 102.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 203.0 255.0 151.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 162.0 253.0 151.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 102.0 254.0 151.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 102.0 253.0 151.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 163.0 254.0 91.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 203.0 253.0 50.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 203.0 203.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 223.0 122.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 72.0 253.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 233.0 252.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 233.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 41.0 253.0 151.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 123.0 254.0 50.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 223.0 233.0 30.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 51.0 253.0 183.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 51.0 252.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 221.0 115.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 51.0 254.0 148.0 0.0 0.0 0.0 0.0 22.0 230.0 134.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 168.0 254.0 115.0 0.0 0.0 0.0 0.0 24.0 253.0 184.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 51.0 234.0 254.0 81.0 0.0 0.0 0.0 0.0 91.0 253.0 184.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 13.0 221.0 254.0 160.0 0.0 0.0 0.0 0.0 0.0 141.0 254.0 127.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 114.0 253.0 253.0 76.0 0.0 0.0 0.0 0.0 0.0 207.0 253.0 93.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 15.0 232.0 253.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 207.0 253.0 17.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 229.0 253.0 202.0 19.0 0.0 0.0 0.0 0.0 0.0 34.0 240.0 253.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 7.0 170.0 254.0 254.0 46.0 0.0 0.0 0.0 0.0 0.0 0.0 47.0 254.0 254.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 24.0 253.0 254.0 253.0 234.0 163.0 47.0 47.0 26.0 0.0 0.0 130.0 253.0 253.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 246.0 254.0 253.0 253.0 253.0 254.0 253.0 232.0 174.0 208.0 232.0 253.0 177.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 84.0 161.0 211.0 219.0 219.0 254.0 253.0 253.0 253.0 254.0 253.0 244.0 69.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 93.0 142.0 142.0 93.0 170.0 254.0 230.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 153.0 253.0 213.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 170.0 253.0 137.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 220.0 253.0 137.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 60.0 255.0 254.0 80.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 93.0 254.0 253.0 46.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 51.0 254.0 215.0 9.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 186.0 106.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 32.0 255.0 254.0 255.0 254.0 254.0 254.0 157.0 130.0 88.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 32.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 108.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 14.0 129.0 238.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 30.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 56.0 253.0 248.0 167.0 235.0 253.0 253.0 253.0 253.0 104.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 178.0 253.0 182.0 0.0 27.0 134.0 247.0 253.0 253.0 215.0 15.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 130.0 253.0 222.0 27.0 0.0 0.0 0.0 186.0 253.0 253.0 253.0 24.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 32.0 253.0 253.0 122.0 0.0 0.0 0.0 0.0 67.0 246.0 253.0 253.0 106.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 117.0 253.0 199.0 25.0 0.0 0.0 0.0 0.0 0.0 187.0 253.0 253.0 148.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 46.0 225.0 245.0 67.0 0.0 0.0 0.0 0.0 0.0 0.0 88.0 253.0 253.0 148.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 149.0 253.0 185.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 88.0 253.0 253.0 148.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 15.0 228.0 253.0 93.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 88.0 253.0 253.0 148.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 19.0 253.0 253.0 93.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 88.0 253.0 253.0 148.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 19.0 253.0 253.0 93.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 88.0 253.0 253.0 109.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 19.0 253.0 253.0 134.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 88.0 253.0 219.0 16.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 19.0 253.0 253.0 230.0 32.0 0.0 0.0 0.0 0.0 0.0 0.0 132.0 253.0 154.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 19.0 253.0 253.0 253.0 233.0 120.0 0.0 74.0 100.0 100.0 200.0 248.0 217.0 33.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 159.0 253.0 253.0 253.0 249.0 230.0 247.0 253.0 253.0 253.0 253.0 109.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 95.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 118.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 41.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 119.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 16.0 51.0 88.0 214.0 165.0 99.0 5.0 5.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 218.0 253.0 11.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 217.0 252.0 92.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 200.0 252.0 252.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 79.0 204.0 250.0 24.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 79.0 249.0 149.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 109.0 252.0 241.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 207.0 252.0 241.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 126.0 252.0 241.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 160.0 252.0 241.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 229.0 252.0 253.0 103.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 53.0 184.0 255.0 171.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 121.0 253.0 228.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 121.0 253.0 228.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 121.0 253.0 228.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 121.0 253.0 228.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 213.0 253.0 235.0 28.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 201.0 253.0 252.0 96.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 121.0 253.0 252.0 96.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 121.0 253.0 252.0 96.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 195.0 241.0 50.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 113.0 193.0 254.0 253.0 254.0 253.0 254.0 172.0 82.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 183.0 253.0 252.0 253.0 252.0 253.0 252.0 253.0 252.0 243.0 40.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 203.0 255.0 233.0 183.0 102.0 203.0 203.0 234.0 253.0 254.0 151.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 81.0 151.0 50.0 0.0 0.0 0.0 41.0 193.0 252.0 253.0 111.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 213.0 254.0 253.0 203.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 123.0 213.0 252.0 253.0 252.0 81.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 51.0 253.0 254.0 253.0 254.0 151.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 10.0 212.0 253.0 252.0 253.0 232.0 223.0 122.0 82.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 123.0 223.0 254.0 253.0 254.0 253.0 254.0 71.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 20.0 50.0 131.0 213.0 252.0 253.0 192.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 162.0 254.0 253.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 203.0 253.0 252.0 61.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 132.0 253.0 254.0 91.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 142.0 253.0 252.0 233.0 30.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 41.0 214.0 253.0 254.0 213.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 163.0 243.0 253.0 252.0 172.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 173.0 173.0 253.0 255.0 253.0 224.0 81.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 132.0 252.0 253.0 252.0 253.0 171.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 153.0 253.0 244.0 203.0 82.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 92.0 192.0 122.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 203.0 193.0 30.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 203.0 253.0 131.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 102.0 254.0 151.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 102.0 253.0 151.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 41.0 254.0 253.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 253.0 252.0 82.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 152.0 253.0 203.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 152.0 252.0 203.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 92.0 253.0 214.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 10.0 212.0 253.0 50.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 203.0 254.0 112.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 162.0 253.0 151.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 102.0 254.0 151.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 102.0 253.0 192.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 102.0 254.0 253.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 102.0 253.0 252.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 41.0 255.0 253.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 253.0 252.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 173.0 253.0 62.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 51.0 252.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 99.0 254.0 254.0 254.0 254.0 217.0 118.0 41.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 178.0 247.0 253.0 253.0 253.0 253.0 253.0 253.0 140.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 244.0 253.0 208.0 177.0 177.0 55.0 99.0 253.0 249.0 92.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 19.0 165.0 179.0 25.0 0.0 0.0 0.0 69.0 253.0 253.0 109.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 69.0 253.0 249.0 95.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 13.0 153.0 253.0 143.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 57.0 240.0 253.0 253.0 89.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 111.0 247.0 253.0 253.0 227.0 41.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 31.0 228.0 253.0 253.0 253.0 253.0 253.0 221.0 88.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 35.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 252.0 206.0 48.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 28.0 205.0 205.0 205.0 82.0 68.0 68.0 188.0 253.0 253.0 226.0 51.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 58.0 167.0 253.0 253.0 224.0 36.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 176.0 253.0 253.0 58.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 173.0 253.0 221.0 37.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 104.0 253.0 253.0 75.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 41.0 227.0 253.0 253.0 75.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 12.0 63.0 140.0 226.0 253.0 253.0 238.0 57.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 41.0 42.0 153.0 193.0 253.0 253.0 253.0 253.0 217.0 86.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 29.0 158.0 251.0 253.0 253.0 253.0 253.0 253.0 232.0 102.0 13.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 16.0 116.0 186.0 253.0 253.0 253.0 227.0 116.0 113.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 16.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 187.0 176.0 76.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 22.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 137.0 254.0 113.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 134.0 139.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 108.0 254.0 113.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 69.0 248.0 254.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 213.0 254.0 113.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 133.0 254.0 204.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 44.0 240.0 254.0 113.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 202.0 254.0 78.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 101.0 254.0 254.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 7.0 207.0 245.0 16.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 12.0 216.0 254.0 173.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 86.0 254.0 153.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 155.0 254.0 254.0 47.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 184.0 254.0 153.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 78.0 240.0 254.0 222.0 8.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 15.0 206.0 254.0 153.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 14.0 203.0 254.0 254.0 48.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 48.0 254.0 254.0 54.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 36.0 254.0 254.0 173.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 48.0 254.0 254.0 35.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 71.0 204.0 254.0 218.0 25.0 0.0 1.0 12.0 12.0 12.0 7.0 12.0 12.0 1.0 0.0 48.0 254.0 173.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 150.0 254.0 254.0 225.0 148.0 148.0 151.0 254.0 254.0 255.0 205.0 254.0 254.0 90.0 13.0 118.0 254.0 157.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 233.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 218.0 225.0 211.0 254.0 203.0 224.0 254.0 53.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 107.0 254.0 254.0 224.0 201.0 189.0 189.0 123.0 71.0 71.0 17.0 27.0 7.0 69.0 178.0 254.0 207.0 15.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 53.0 53.0 28.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 148.0 254.0 150.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 35.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 228.0 211.0 89.0 0.0 0.0 0.0 0.0 0.0 0.0 51.0 121.0 121.0 226.0 253.0 232.0 44.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 61.0 235.0 249.0 240.0 240.0 240.0 240.0 240.0 241.0 245.0 252.0 252.0 252.0 252.0 252.0 93.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 183.0 252.0 252.0 252.0 252.0 252.0 253.0 252.0 252.0 252.0 252.0 252.0 252.0 93.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 39.0 39.0 53.0 95.0 39.0 39.0 39.0 39.0 219.0 252.0 252.0 197.0 63.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 75.0 244.0 252.0 209.0 17.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 122.0 252.0 252.0 198.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 95.0 244.0 252.0 252.0 177.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 13.0 241.0 252.0 252.0 126.0 24.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 8.0 197.0 252.0 252.0 248.0 50.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 8.0 196.0 253.0 252.0 252.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 13.0 197.0 253.0 255.0 253.0 159.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 17.0 123.0 252.0 252.0 253.0 252.0 103.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 90.0 252.0 252.0 252.0 253.0 37.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 17.0 198.0 252.0 252.0 209.0 110.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 18.0 176.0 252.0 252.0 248.0 88.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 17.0 107.0 252.0 252.0 252.0 140.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 171.0 252.0 252.0 252.0 233.0 33.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 10.0 217.0 252.0 252.0 252.0 140.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 89.0 250.0 252.0 252.0 221.0 39.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 213.0 217.0 217.0 79.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 36.0 125.0 191.0 218.0 255.0 254.0 254.0 241.0 51.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 204.0 249.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 250.0 235.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 88.0 241.0 251.0 253.0 225.0 142.0 49.0 12.0 12.0 12.0 105.0 253.0 253.0 111.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 95.0 225.0 253.0 167.0 113.0 14.0 0.0 0.0 0.0 0.0 0.0 16.0 211.0 253.0 117.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 91.0 238.0 253.0 170.0 28.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 150.0 253.0 117.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 98.0 251.0 218.0 48.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 150.0 253.0 117.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 112.0 253.0 112.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 9.0 184.0 242.0 18.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 20.0 45.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 67.0 253.0 240.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 27.0 234.0 248.0 105.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 44.0 157.0 253.0 132.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 189.0 253.0 203.0 27.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 156.0 253.0 246.0 77.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 156.0 253.0 202.0 68.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 156.0 253.0 226.0 71.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 30.0 33.0 33.0 140.0 163.0 186.0 253.0 226.0 38.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 12.0 81.0 244.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 186.0 70.0 23.0 0.0 0.0 22.0 156.0 77.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 80.0 195.0 253.0 253.0 253.0 253.0 253.0 248.0 234.0 166.0 248.0 253.0 253.0 240.0 150.0 73.0 144.0 104.0 51.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 7.0 248.0 253.0 253.0 253.0 253.0 253.0 242.0 105.0 0.0 0.0 107.0 242.0 253.0 253.0 253.0 245.0 160.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 57.0 250.0 253.0 253.0 253.0 247.0 135.0 21.0 0.0 0.0 0.0 0.0 21.0 117.0 183.0 183.0 48.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 121.0 123.0 176.0 135.0 16.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 61.0 156.0 148.0 89.0 81.0 156.0 255.0 254.0 254.0 254.0 216.0 156.0 148.0 41.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 26.0 207.0 254.0 253.0 253.0 253.0 245.0 234.0 195.0 233.0 233.0 233.0 246.0 253.0 241.0 24.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 166.0 253.0 254.0 253.0 253.0 128.0 48.0 0.0 0.0 0.0 0.0 0.0 48.0 226.0 253.0 87.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 174.0 251.0 253.0 244.0 124.0 19.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 214.0 253.0 19.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 132.0 253.0 253.0 177.0 45.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 46.0 244.0 253.0 19.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 195.0 90.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 179.0 254.0 152.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 8.0 254.0 251.0 72.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 165.0 254.0 165.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 37.0 248.0 254.0 46.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 77.0 253.0 171.0 9.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 19.0 239.0 254.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 92.0 253.0 253.0 215.0 214.0 214.0 181.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 19.0 167.0 253.0 253.0 253.0 254.0 253.0 253.0 213.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 201.0 253.0 253.0 253.0 185.0 117.0 34.0 19.0 16.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 119.0 73.0 193.0 237.0 36.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 80.0 254.0 214.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 118.0 253.0 168.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 118.0 253.0 117.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 118.0 253.0 117.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 72.0 193.0 34.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 13.0 218.0 209.0 62.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 189.0 252.0 185.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 169.0 252.0 215.0 6.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 169.0 252.0 253.0 63.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 169.0 252.0 253.0 63.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 109.0 253.0 254.0 168.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 252.0 253.0 168.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 59.0 249.0 253.0 210.0 11.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 211.0 253.0 252.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 211.0 253.0 252.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 212.0 255.0 253.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 211.0 253.0 252.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 211.0 253.0 252.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 167.0 253.0 252.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 211.0 253.0 252.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 212.0 255.0 253.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 131.0 253.0 252.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 106.0 253.0 252.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 106.0 253.0 252.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 18.0 209.0 182.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 50.0 170.0 254.0 59.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 36.0 191.0 245.0 254.0 254.0 175.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 70.0 242.0 254.0 235.0 233.0 254.0 182.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 23.0 184.0 254.0 243.0 99.0 27.0 110.0 254.0 182.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 20.0 205.0 247.0 98.0 26.0 0.0 0.0 110.0 254.0 149.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 40.0 104.0 20.0 0.0 0.0 0.0 0.0 110.0 254.0 33.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 110.0 234.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 32.0 214.0 149.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 134.0 200.0 16.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 20.0 231.0 144.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 146.0 244.0 72.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 16.0 201.0 132.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 164.0 226.0 31.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 122.0 205.0 47.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 79.0 255.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 15.0 84.0 216.0 250.0 144.0 12.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 7.0 207.0 228.0 37.0 0.0 0.0 0.0 0.0 20.0 136.0 238.0 254.0 228.0 63.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 135.0 254.0 66.0 0.0 0.0 0.0 53.0 190.0 254.0 254.0 197.0 117.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 231.0 182.0 0.0 32.0 101.0 184.0 249.0 239.0 179.0 96.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 254.0 99.0 128.0 232.0 254.0 251.0 185.0 59.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 221.0 254.0 254.0 254.0 254.0 192.0 70.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 55.0 254.0 254.0 188.0 105.0 72.0 11.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 66.0 222.0 29.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 31.0 223.0 254.0 127.0 9.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 66.0 254.0 254.0 254.0 173.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 181.0 254.0 254.0 254.0 173.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 181.0 254.0 254.0 254.0 158.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 181.0 254.0 254.0 243.0 42.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 34.0 230.0 254.0 254.0 179.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 135.0 254.0 254.0 254.0 155.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 10.0 192.0 254.0 254.0 254.0 55.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 44.0 254.0 254.0 254.0 254.0 55.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 44.0 254.0 254.0 254.0 236.0 41.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 44.0 254.0 254.0 254.0 186.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 44.0 254.0 254.0 254.0 86.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 44.0 254.0 254.0 202.0 11.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 23.0 215.0 254.0 246.0 99.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 27.0 223.0 254.0 254.0 186.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 19.0 208.0 254.0 254.0 186.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 23.0 215.0 254.0 254.0 186.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 24.0 217.0 254.0 254.0 186.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 114.0 255.0 255.0 125.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 161.0 31.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 217.0 151.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 133.0 231.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 78.0 231.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 66.0 234.0 9.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 54.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 54.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 54.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 93.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 84.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 31.0 255.0 77.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 78.0 254.0 54.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 78.0 233.0 7.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 231.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 165.0 231.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 231.0 212.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 231.0 151.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 7.0 233.0 78.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 54.0 253.0 38.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 101.0 253.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 22.0 97.0 181.0 254.0 255.0 221.0 106.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 28.0 128.0 213.0 245.0 254.0 254.0 246.0 239.0 254.0 254.0 94.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 27.0 151.0 239.0 254.0 254.0 222.0 204.0 189.0 70.0 27.0 215.0 254.0 98.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 43.0 248.0 254.0 233.0 40.0 15.0 0.0 0.0 0.0 0.0 96.0 254.0 111.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 121.0 72.0 33.0 0.0 0.0 0.0 0.0 0.0 0.0 76.0 254.0 187.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 94.0 254.0 149.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 124.0 254.0 40.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 203.0 174.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 102.0 254.0 122.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 40.0 223.0 205.0 254.0 115.0 33.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 40.0 248.0 254.0 254.0 254.0 242.0 191.0 71.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 140.0 254.0 254.0 248.0 209.0 254.0 213.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 186.0 208.0 71.0 49.0 74.0 191.0 134.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 134.0 254.0 119.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 16.0 197.0 168.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 140.0 225.0 43.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 51.0 233.0 106.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 161.0 227.0 17.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 228.0 124.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 168.0 6.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 121.0 255.0 165.0 0.0 0.0 0.0 0.0 0.0 0.0 70.0 254.0 179.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 131.0 254.0 153.0 0.0 0.0 0.0 0.0 0.0 0.0 106.0 254.0 249.0 50.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 216.0 254.0 105.0 0.0 0.0 0.0 0.0 0.0 0.0 140.0 254.0 240.0 37.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 14.0 225.0 254.0 84.0 0.0 0.0 0.0 0.0 0.0 85.0 233.0 254.0 215.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 58.0 254.0 254.0 46.0 0.0 0.0 0.0 0.0 8.0 186.0 254.0 254.0 206.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 58.0 254.0 254.0 9.0 0.0 0.0 0.0 0.0 146.0 254.0 254.0 254.0 120.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 150.0 254.0 254.0 9.0 0.0 0.0 0.0 127.0 251.0 254.0 254.0 239.0 22.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 153.0 254.0 254.0 9.0 0.0 0.0 92.0 246.0 254.0 254.0 254.0 181.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 105.0 241.0 254.0 40.0 0.0 27.0 244.0 254.0 254.0 254.0 254.0 150.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 161.0 254.0 169.0 100.0 244.0 254.0 254.0 254.0 254.0 252.0 70.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 68.0 176.0 253.0 254.0 254.0 245.0 167.0 254.0 254.0 202.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 99.0 177.0 146.0 35.0 110.0 254.0 254.0 148.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 206.0 254.0 254.0 131.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 130.0 254.0 219.0 11.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 174.0 254.0 210.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 155.0 254.0 124.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 185.0 254.0 115.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 206.0 254.0 115.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 194.0 254.0 115.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 27.0 192.0 115.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 41.0 102.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 82.0 214.0 253.0 163.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 31.0 232.0 223.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 203.0 244.0 40.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 41.0 243.0 162.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 72.0 253.0 41.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 41.0 233.0 212.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 173.0 224.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 132.0 252.0 162.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 254.0 192.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 203.0 233.0 50.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 132.0 253.0 102.0 0.0 31.0 51.0 51.0 51.0 113.0 112.0 113.0 152.0 132.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 82.0 253.0 252.0 223.0 203.0 233.0 252.0 253.0 252.0 253.0 252.0 253.0 252.0 253.0 91.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 51.0 173.0 253.0 254.0 253.0 254.0 213.0 102.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 163.0 203.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 123.0 213.0 252.0 253.0 252.0 192.0 111.0 50.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 40.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 173.0 253.0 255.0 253.0 224.0 40.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 253.0 252.0 253.0 130.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 102.0 102.0 41.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 23.0 151.0 255.0 254.0 163.0 32.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 23.0 211.0 253.0 253.0 253.0 253.0 68.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 155.0 241.0 152.0 135.0 248.0 253.0 185.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 140.0 84.0 0.0 0.0 162.0 247.0 192.0 6.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 7.0 194.0 253.0 55.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 56.0 253.0 253.0 55.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 78.0 253.0 208.0 19.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 180.0 253.0 185.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 36.0 232.0 253.0 200.0 56.0 11.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 50.0 253.0 253.0 253.0 253.0 159.0 41.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 37.0 185.0 235.0 253.0 253.0 253.0 190.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 41.0 89.0 201.0 253.0 253.0 206.0 24.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 15.0 214.0 253.0 253.0 30.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 205.0 253.0 253.0 30.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 26.0 129.0 246.0 253.0 219.0 19.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 74.0 202.0 253.0 253.0 219.0 37.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 97.0 230.0 247.0 253.0 253.0 168.0 37.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 96.0 248.0 253.0 253.0 253.0 129.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 167.0 253.0 253.0 253.0 130.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 107.0 253.0 226.0 38.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 163.0 193.0 152.0 92.0 51.0 51.0 51.0 51.0 31.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 223.0 253.0 252.0 253.0 252.0 253.0 252.0 253.0 192.0 82.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 51.0 253.0 102.0 0.0 21.0 102.0 62.0 102.0 102.0 61.0 183.0 40.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 51.0 252.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 61.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 51.0 253.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 92.0 252.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 173.0 253.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 253.0 252.0 223.0 203.0 203.0 203.0 82.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 123.0 254.0 253.0 224.0 203.0 203.0 223.0 254.0 71.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 41.0 243.0 253.0 130.0 20.0 0.0 0.0 20.0 253.0 232.0 41.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 152.0 253.0 183.0 0.0 0.0 0.0 0.0 0.0 132.0 253.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 51.0 151.0 20.0 0.0 0.0 0.0 0.0 0.0 51.0 252.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 113.0 253.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 82.0 183.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 193.0 252.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 203.0 183.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 254.0 253.0 41.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 223.0 102.0 0.0 0.0 0.0 0.0 0.0 21.0 203.0 253.0 130.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 204.0 123.0 0.0 0.0 0.0 0.0 41.0 173.0 253.0 203.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 162.0 223.0 102.0 21.0 102.0 163.0 243.0 253.0 171.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 41.0 234.0 253.0 255.0 253.0 255.0 172.0 82.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 30.0 131.0 192.0 111.0 50.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 151.0 253.0 167.0 9.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 25.0 222.0 252.0 252.0 66.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 198.0 252.0 252.0 187.0 13.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 140.0 252.0 252.0 252.0 90.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 70.0 248.0 252.0 252.0 142.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 193.0 252.0 252.0 229.0 39.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 69.0 252.0 252.0 252.0 211.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 10.0 235.0 252.0 252.0 226.0 14.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 121.0 252.0 252.0 253.0 77.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 195.0 252.0 253.0 201.0 19.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 188.0 253.0 255.0 253.0 44.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 158.0 252.0 253.0 252.0 121.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 78.0 252.0 253.0 252.0 192.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 212.0 253.0 252.0 252.0 116.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 111.0 253.0 252.0 252.0 192.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 72.0 253.0 252.0 252.0 238.0 31.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 200.0 252.0 252.0 252.0 140.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 125.0 252.0 252.0 252.0 197.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 34.0 252.0 252.0 252.0 116.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 110.0 233.0 243.0 50.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 76.0 174.0 226.0 255.0 185.0 53.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 222.0 83.0 68.0 74.0 186.0 243.0 122.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 95.0 11.0 0.0 0.0 7.0 114.0 242.0 97.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 7.0 114.0 222.0 24.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 24.0 219.0 167.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 71.0 223.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 44.0 249.0 84.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 182.0 165.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 218.0 165.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 241.0 165.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 65.0 254.0 97.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 65.0 254.0 38.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 72.0 79.0 102.0 20.0 0.0 0.0 165.0 181.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 20.0 159.0 242.0 246.0 246.0 242.0 119.0 59.0 253.0 95.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 187.0 223.0 35.0 0.0 5.0 116.0 243.0 254.0 207.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 28.0 243.0 103.0 0.0 0.0 0.0 0.0 81.0 254.0 218.0 18.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 63.0 254.0 32.0 0.0 0.0 0.0 78.0 244.0 214.0 226.0 200.0 16.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 37.0 254.0 50.0 0.0 56.0 93.0 245.0 214.0 30.0 42.0 227.0 202.0 58.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 192.0 241.0 230.0 253.0 254.0 167.0 29.0 0.0 0.0 40.0 134.0 244.0 184.0 69.0 32.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 22.0 137.0 173.0 94.0 12.0 3.0 0.0 0.0 0.0 0.0 1.0 102.0 209.0 240.0 54.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 111.0 133.0 82.0 1.0 0.0 0.0 0.0 3.0 100.0 168.0 214.0 19.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 85.0 253.0 253.0 253.0 11.0 0.0 0.0 4.0 127.0 253.0 253.0 253.0 36.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 56.0 231.0 253.0 253.0 238.0 10.0 0.0 0.0 37.0 253.0 253.0 253.0 253.0 111.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 182.0 253.0 253.0 253.0 144.0 0.0 0.0 0.0 37.0 253.0 253.0 253.0 253.0 133.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 233.0 253.0 253.0 253.0 58.0 0.0 0.0 0.0 37.0 253.0 253.0 253.0 253.0 36.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 194.0 253.0 253.0 253.0 253.0 24.0 0.0 4.0 85.0 202.0 253.0 253.0 253.0 253.0 36.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 37.0 253.0 253.0 253.0 253.0 253.0 101.0 85.0 209.0 253.0 253.0 253.0 253.0 253.0 184.0 7.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 141.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 254.0 253.0 253.0 253.0 253.0 253.0 65.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 106.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 254.0 253.0 253.0 253.0 253.0 187.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 37.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 254.0 253.0 253.0 253.0 253.0 180.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 35.0 248.0 242.0 149.0 220.0 242.0 242.0 242.0 244.0 254.0 254.0 255.0 254.0 175.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 52.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 191.0 253.0 253.0 253.0 60.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 145.0 253.0 253.0 253.0 77.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 9.0 218.0 253.0 253.0 253.0 180.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 42.0 253.0 253.0 253.0 253.0 151.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 226.0 253.0 253.0 253.0 253.0 60.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 99.0 254.0 253.0 253.0 253.0 253.0 60.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 122.0 254.0 253.0 253.0 253.0 230.0 37.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 12.0 254.0 253.0 253.0 253.0 83.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 253.0 160.0 11.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 113.0 213.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 51.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 233.0 252.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 51.0 252.0 82.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 253.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 51.0 253.0 163.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 253.0 252.0 41.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 51.0 252.0 223.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 253.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 51.0 253.0 254.0 50.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 253.0 252.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 51.0 252.0 253.0 50.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 253.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 51.0 253.0 254.0 50.0 52.0 131.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 253.0 252.0 61.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 92.0 252.0 213.0 51.0 193.0 151.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 253.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 152.0 253.0 254.0 253.0 203.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 253.0 252.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 41.0 193.0 252.0 253.0 212.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 193.0 253.0 254.0 131.0 51.0 51.0 51.0 132.0 214.0 253.0 254.0 253.0 254.0 50.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 51.0 232.0 253.0 252.0 253.0 252.0 253.0 252.0 253.0 252.0 253.0 252.0 213.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 82.0 234.0 253.0 254.0 253.0 244.0 203.0 142.0 102.0 254.0 253.0 183.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 30.0 50.0 50.0 50.0 40.0 0.0 0.0 0.0 253.0 252.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 152.0 253.0 203.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 233.0 252.0 122.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 253.0 103.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 253.0 252.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 173.0 253.0 103.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 10.0 172.0 61.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 35.0 156.0 246.0 58.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 28.0 217.0 253.0 250.0 54.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 127.0 253.0 253.0 153.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 53.0 246.0 253.0 195.0 9.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 135.0 254.0 200.0 18.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 100.0 254.0 241.0 30.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 7.0 183.0 253.0 105.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 79.0 253.0 185.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 191.0 134.0 216.0 34.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 46.0 244.0 253.0 79.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 217.0 254.0 183.0 8.0 0.0 0.0 0.0 41.0 27.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 253.0 78.0 0.0 16.0 140.0 214.0 241.0 217.0 72.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 61.0 254.0 247.0 54.0 0.0 135.0 152.0 166.0 253.0 253.0 223.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 195.0 254.0 180.0 0.0 0.0 0.0 0.0 12.0 223.0 253.0 253.0 76.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 195.0 254.0 99.0 0.0 0.0 0.0 0.0 20.0 253.0 253.0 215.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 196.0 255.0 136.0 0.0 0.0 0.0 0.0 20.0 254.0 254.0 133.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 195.0 254.0 190.0 88.0 2.0 0.0 5.0 76.0 253.0 250.0 54.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 223.0 253.0 253.0 166.0 79.0 156.0 253.0 253.0 146.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 8.0 72.0 202.0 253.0 253.0 253.0 254.0 253.0 225.0 23.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 58.0 200.0 215.0 193.0 73.0 18.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 25.0 60.0 60.0 131.0 209.0 209.0 209.0 209.0 209.0 209.0 211.0 174.0 60.0 32.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 202.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 254.0 253.0 253.0 211.0 28.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 254.0 253.0 253.0 253.0 178.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 91.0 178.0 178.0 178.0 178.0 178.0 99.0 29.0 29.0 29.0 91.0 240.0 253.0 253.0 178.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 93.0 240.0 253.0 253.0 160.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 24.0 134.0 254.0 253.0 253.0 253.0 29.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 27.0 90.0 90.0 232.0 242.0 253.0 254.0 253.0 253.0 253.0 109.0 80.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 93.0 212.0 253.0 253.0 253.0 253.0 253.0 254.0 253.0 253.0 253.0 253.0 246.0 116.0 46.0 11.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 120.0 253.0 253.0 253.0 253.0 253.0 253.0 254.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 147.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 121.0 254.0 254.0 254.0 155.0 124.0 0.0 0.0 0.0 0.0 72.0 149.0 224.0 254.0 255.0 254.0 105.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 44.0 44.0 44.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 49.0 225.0 253.0 253.0 139.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 48.0 244.0 253.0 253.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 72.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 246.0 253.0 182.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 67.0 241.0 145.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 72.0 240.0 253.0 253.0 104.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 75.0 253.0 253.0 183.0 179.0 179.0 119.0 66.0 179.0 179.0 179.0 232.0 253.0 242.0 196.0 31.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 36.0 214.0 253.0 253.0 253.0 253.0 254.0 253.0 253.0 253.0 253.0 253.0 253.0 163.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 10.0 94.0 163.0 179.0 200.0 255.0 253.0 253.0 253.0 226.0 163.0 163.0 17.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 24.0 59.0 95.0 111.0 59.0 42.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 9.0 77.0 50.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 63.0 119.0 171.0 242.0 243.0 202.0 98.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 49.0 21.0 0.0 24.0 119.0 204.0 254.0 255.0 227.0 128.0 107.0 7.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 30.0 187.0 254.0 232.0 215.0 234.0 254.0 241.0 159.0 74.0 18.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 18.0 217.0 254.0 254.0 254.0 251.0 221.0 105.0 34.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 18.0 199.0 254.0 254.0 249.0 162.0 66.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 187.0 254.0 254.0 196.0 31.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 57.0 240.0 254.0 163.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 222.0 254.0 161.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 34.0 242.0 248.0 76.0 34.0 107.0 134.0 218.0 177.0 93.0 26.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 117.0 254.0 248.0 241.0 243.0 254.0 235.0 223.0 240.0 254.0 236.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 198.0 254.0 254.0 201.0 144.0 58.0 22.0 0.0 31.0 142.0 250.0 233.0 104.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 18.0 151.0 85.0 15.0 0.0 0.0 0.0 0.0 0.0 0.0 132.0 254.0 175.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 108.0 254.0 254.0 9.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 33.0 209.0 254.0 176.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 228.0 254.0 233.0 45.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 14.0 98.0 182.0 250.0 254.0 231.0 79.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 28.0 27.0 27.0 103.0 117.0 151.0 222.0 254.0 254.0 240.0 142.0 28.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 242.0 249.0 250.0 253.0 247.0 245.0 241.0 184.0 100.0 30.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 46.0 49.0 65.0 34.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 38.0 154.0 215.0 241.0 77.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 81.0 233.0 177.0 70.0 23.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 52.0 146.0 146.0 149.0 177.0 224.0 115.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 221.0 207.0 161.0 184.0 106.0 43.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 248.0 62.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 53.0 252.0 62.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 68.0 253.0 62.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 146.0 254.0 62.0 0.0 0.0 4.0 31.0 13.0 32.0 55.0 31.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 107.0 254.0 62.0 14.0 83.0 214.0 254.0 226.0 254.0 254.0 254.0 181.0 65.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 70.0 254.0 154.0 225.0 251.0 167.0 84.0 70.0 23.0 23.0 91.0 179.0 250.0 105.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 22.0 204.0 220.0 154.0 33.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 110.0 255.0 53.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 9.0 210.0 230.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 95.0 250.0 40.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 62.0 254.0 69.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 74.0 248.0 17.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 181.0 246.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 31.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 18.0 229.0 192.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 14.0 236.0 78.0 2.0 0.0 0.0 0.0 0.0 0.0 18.0 161.0 233.0 185.0 9.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 114.0 254.0 90.0 32.0 12.0 55.0 85.0 168.0 234.0 234.0 129.0 7.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 130.0 226.0 244.0 236.0 254.0 247.0 176.0 109.0 40.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 16.0 206.0 217.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 17.0 205.0 253.0 216.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 17.0 205.0 253.0 251.0 139.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 136.0 253.0 253.0 149.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 20.0 208.0 253.0 238.0 39.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 209.0 253.0 253.0 149.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 253.0 241.0 36.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 253.0 235.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 38.0 50.0 50.0 50.0 50.0 50.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 253.0 235.0 0.0 0.0 0.0 0.0 0.0 68.0 180.0 236.0 253.0 253.0 253.0 253.0 253.0 187.0 126.0 30.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 253.0 235.0 0.0 0.0 0.0 0.0 13.0 198.0 253.0 253.0 204.0 191.0 148.0 128.0 176.0 247.0 253.0 222.0 126.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 253.0 140.0 0.0 0.0 0.0 0.0 144.0 253.0 253.0 168.0 14.0 0.0 0.0 0.0 0.0 108.0 215.0 253.0 253.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 253.0 208.0 0.0 0.0 0.0 0.0 174.0 253.0 253.0 61.0 0.0 0.0 0.0 0.0 0.0 0.0 112.0 253.0 253.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 253.0 235.0 0.0 0.0 0.0 0.0 174.0 253.0 253.0 61.0 0.0 0.0 0.0 0.0 0.0 0.0 112.0 253.0 214.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 253.0 241.0 36.0 0.0 0.0 0.0 174.0 253.0 253.0 164.0 0.0 0.0 0.0 0.0 0.0 0.0 112.0 253.0 87.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 103.0 253.0 253.0 232.0 85.0 0.0 0.0 25.0 125.0 229.0 244.0 181.0 64.0 0.0 0.0 0.0 0.0 157.0 253.0 112.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 207.0 253.0 253.0 208.0 0.0 0.0 0.0 0.0 114.0 229.0 253.0 244.0 87.0 0.0 0.0 42.0 243.0 253.0 81.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 25.0 253.0 253.0 250.0 150.0 36.0 0.0 0.0 0.0 52.0 148.0 181.0 245.0 184.0 106.0 228.0 253.0 95.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 88.0 207.0 253.0 253.0 242.0 211.0 112.0 112.0 112.0 112.0 118.0 172.0 253.0 253.0 207.0 26.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 80.0 135.0 210.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 213.0 135.0 87.0 7.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 27.0 129.0 129.0 129.0 129.0 129.0 129.0 25.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 10.0 29.0 4.0 104.0 229.0 253.0 129.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 85.0 252.0 179.0 252.0 252.0 252.0 253.0 122.0 13.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 123.0 252.0 253.0 252.0 148.0 56.0 253.0 252.0 143.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 51.0 246.0 252.0 253.0 102.0 6.0 0.0 153.0 252.0 168.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 170.0 253.0 253.0 255.0 84.0 0.0 0.0 13.0 207.0 253.0 91.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 169.0 252.0 252.0 247.0 65.0 0.0 0.0 0.0 169.0 252.0 215.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 169.0 252.0 252.0 100.0 0.0 0.0 0.0 0.0 82.0 252.0 252.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 26.0 243.0 252.0 252.0 0.0 0.0 0.0 0.0 0.0 57.0 252.0 252.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 41.0 253.0 253.0 253.0 0.0 0.0 0.0 0.0 0.0 57.0 253.0 253.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 141.0 252.0 252.0 252.0 0.0 0.0 0.0 0.0 0.0 57.0 252.0 252.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 229.0 252.0 224.0 168.0 0.0 0.0 0.0 0.0 0.0 57.0 252.0 252.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 253.0 252.0 168.0 0.0 0.0 0.0 0.0 0.0 0.0 57.0 252.0 252.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 253.0 168.0 0.0 0.0 0.0 0.0 0.0 0.0 120.0 253.0 190.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 253.0 252.0 93.0 0.0 0.0 0.0 0.0 0.0 0.0 169.0 252.0 65.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 253.0 252.0 56.0 0.0 0.0 0.0 0.0 0.0 10.0 197.0 252.0 28.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 253.0 252.0 156.0 0.0 0.0 0.0 0.0 0.0 179.0 252.0 177.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 179.0 253.0 178.0 16.0 0.0 19.0 66.0 191.0 254.0 209.0 25.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 22.0 234.0 252.0 215.0 169.0 225.0 252.0 252.0 209.0 28.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 131.0 252.0 252.0 253.0 252.0 252.0 214.0 25.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 7.0 65.0 240.0 253.0 177.0 103.0 15.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 92.0 253.0 141.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 19.0 196.0 252.0 241.0 24.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 147.0 225.0 97.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 57.0 252.0 252.0 253.0 27.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 32.0 253.0 252.0 195.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 57.0 252.0 252.0 178.0 9.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 140.0 253.0 252.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 57.0 252.0 252.0 140.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 16.0 203.0 253.0 252.0 55.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 120.0 253.0 253.0 141.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 29.0 253.0 255.0 215.0 31.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 197.0 252.0 252.0 140.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 29.0 252.0 253.0 42.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 197.0 252.0 252.0 31.0 0.0 0.0 0.0 0.0 0.0 0.0 13.0 79.0 252.0 253.0 27.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 57.0 234.0 252.0 236.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 57.0 252.0 252.0 178.0 9.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 85.0 252.0 252.0 189.0 141.0 140.0 140.0 140.0 140.0 79.0 48.0 165.0 252.0 252.0 140.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 86.0 253.0 253.0 253.0 255.0 253.0 253.0 253.0 253.0 255.0 253.0 253.0 253.0 253.0 141.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 57.0 233.0 252.0 252.0 253.0 252.0 252.0 242.0 214.0 215.0 243.0 252.0 252.0 252.0 140.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 75.0 195.0 195.0 56.0 55.0 55.0 49.0 31.0 31.0 50.0 209.0 252.0 220.0 31.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 73.0 234.0 252.0 112.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 225.0 252.0 252.0 112.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 226.0 253.0 253.0 112.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 101.0 249.0 252.0 242.0 74.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 113.0 252.0 252.0 246.0 88.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 38.0 234.0 252.0 154.0 99.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 146.0 252.0 84.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 77.0 254.0 103.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 203.0 253.0 217.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 253.0 199.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 253.0 96.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 247.0 73.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 35.0 254.0 229.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 162.0 254.0 130.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 242.0 254.0 109.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 100.0 252.0 243.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 110.0 253.0 127.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 116.0 254.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 10.0 232.0 253.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 98.0 253.0 236.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 178.0 253.0 110.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 218.0 253.0 11.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 218.0 170.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 29.0 230.0 144.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 85.0 253.0 144.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 8.0 221.0 144.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 160.0 196.0 6.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 27.0 73.0 157.0 163.0 195.0 163.0 27.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 60.0 184.0 242.0 254.0 253.0 253.0 253.0 253.0 158.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 50.0 179.0 248.0 253.0 253.0 217.0 197.0 127.0 165.0 242.0 254.0 63.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 116.0 234.0 253.0 250.0 163.0 80.0 0.0 0.0 0.0 0.0 181.0 254.0 108.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 116.0 253.0 254.0 214.0 62.0 0.0 0.0 0.0 0.0 0.0 0.0 181.0 254.0 160.0 13.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 95.0 254.0 254.0 182.0 7.0 0.0 0.0 0.0 0.0 0.0 0.0 38.0 228.0 255.0 254.0 127.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 253.0 201.0 7.0 0.0 0.0 0.0 0.0 0.0 32.0 55.0 172.0 253.0 254.0 253.0 42.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 253.0 207.0 69.0 37.0 32.0 16.0 102.0 186.0 238.0 253.0 253.0 253.0 254.0 160.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 86.0 249.0 253.0 254.0 253.0 245.0 222.0 253.0 254.0 253.0 253.0 253.0 253.0 254.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 96.0 227.0 254.0 253.0 253.0 253.0 220.0 136.0 72.0 105.0 214.0 253.0 228.0 12.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 59.0 91.0 46.0 0.0 0.0 0.0 0.0 63.0 254.0 254.0 92.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 179.0 253.0 201.0 7.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 28.0 235.0 253.0 85.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 127.0 253.0 238.0 16.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 145.0 253.0 202.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 47.0 241.0 254.0 144.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 182.0 253.0 245.0 81.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 46.0 254.0 253.0 138.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 155.0 254.0 223.0 72.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 59.0 195.0 70.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 8.0 123.0 162.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 84.0 103.0 202.0 225.0 85.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 18.0 40.0 171.0 223.0 240.0 236.0 74.0 58.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 49.0 64.0 134.0 240.0 255.0 253.0 161.0 57.0 14.0 36.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 98.0 212.0 213.0 243.0 253.0 253.0 253.0 192.0 68.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 160.0 230.0 231.0 230.0 159.0 80.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 36.0 84.0 121.0 27.0 27.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 43.0 126.0 94.0 57.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 85.0 202.0 48.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 14.0 237.0 243.0 35.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 36.0 180.0 255.0 210.0 193.0 37.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 32.0 63.0 63.0 183.0 142.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 149.0 204.0 9.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 225.0 14.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 94.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 220.0 11.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 22.0 173.0 254.0 63.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 125.0 253.0 224.0 32.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 22.0 253.0 200.0 36.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 130.0 7.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 191.0 255.0 128.0 128.0 128.0 64.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 255.0 255.0 255.0 255.0 255.0 255.0 255.0 255.0 255.0 255.0 128.0 128.0 64.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 255.0 255.0 255.0 255.0 255.0 255.0 255.0 255.0 255.0 255.0 255.0 255.0 255.0 191.0 64.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 64.0 128.0 128.0 128.0 128.0 255.0 255.0 255.0 255.0 255.0 255.0 255.0 255.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 191.0 255.0 255.0 255.0 255.0 255.0 64.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 255.0 255.0 255.0 255.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 255.0 255.0 255.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 255.0 255.0 255.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 255.0 255.0 255.0 64.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 255.0 255.0 255.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 255.0 255.0 255.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 255.0 255.0 191.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 191.0 255.0 255.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 255.0 255.0 255.0 64.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 255.0 255.0 191.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 255.0 255.0 64.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 191.0 255.0 255.0 255.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 255.0 255.0 255.0 191.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 255.0 255.0 191.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 255.0 255.0 64.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 43.0 47.0 47.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 9.0 108.0 249.0 253.0 253.0 208.0 207.0 207.0 207.0 149.0 65.0 13.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 9.0 184.0 254.0 253.0 253.0 253.0 254.0 253.0 253.0 253.0 254.0 253.0 213.0 25.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 55.0 203.0 254.0 254.0 199.0 127.0 127.0 60.0 93.0 84.0 68.0 151.0 222.0 254.0 161.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 138.0 253.0 253.0 199.0 19.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 155.0 253.0 211.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 138.0 253.0 253.0 17.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 74.0 241.0 253.0 211.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 105.0 253.0 253.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 34.0 229.0 253.0 253.0 160.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 149.0 254.0 229.0 40.0 0.0 0.0 0.0 38.0 153.0 254.0 254.0 254.0 180.0 25.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 19.0 198.0 254.0 207.0 9.0 34.0 72.0 235.0 253.0 253.0 224.0 139.0 13.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 17.0 211.0 253.0 215.0 240.0 254.0 253.0 234.0 128.0 17.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 102.0 229.0 253.0 253.0 253.0 228.0 77.0 13.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 70.0 170.0 254.0 254.0 254.0 254.0 254.0 254.0 119.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 26.0 130.0 230.0 254.0 253.0 253.0 185.0 115.0 64.0 211.0 253.0 248.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 166.0 232.0 253.0 253.0 247.0 162.0 46.0 13.0 7.0 91.0 245.0 253.0 254.0 56.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 253.0 253.0 253.0 210.0 93.0 127.0 159.0 204.0 253.0 253.0 253.0 228.0 15.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 134.0 241.0 254.0 255.0 254.0 254.0 254.0 254.0 254.0 254.0 228.0 34.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 27.0 115.0 140.0 206.0 206.0 206.0 207.0 206.0 123.0 15.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 142.0 254.0 204.0 172.0 199.0 140.0 91.0 27.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 68.0 222.0 81.0 74.0 153.0 185.0 237.0 237.0 250.0 194.0 29.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 166.0 196.0 0.0 0.0 0.0 0.0 0.0 0.0 115.0 81.0 11.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 213.0 159.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 7.0 220.0 115.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 34.0 246.0 130.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 168.0 246.0 21.0 0.0 0.0 0.0 0.0 138.0 69.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 131.0 254.0 99.0 0.0 0.0 0.0 0.0 189.0 139.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 82.0 254.0 107.0 0.0 0.0 0.0 85.0 229.0 89.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 196.0 228.0 11.0 0.0 0.0 154.0 254.0 57.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 110.0 254.0 129.0 1.0 9.0 207.0 255.0 57.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 193.0 254.0 183.0 188.0 175.0 254.0 57.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 17.0 116.0 147.0 22.0 146.0 254.0 57.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 99.0 254.0 57.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 99.0 254.0 57.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 167.0 254.0 57.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 135.0 232.0 8.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 99.0 251.0 52.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 99.0 246.0 41.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 126.0 229.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 55.0 192.0 87.0 11.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 169.0 252.0 253.0 170.0 43.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 111.0 249.0 253.0 252.0 233.0 101.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 115.0 227.0 252.0 252.0 252.0 138.0 27.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 87.0 112.0 147.0 252.0 252.0 150.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 9.0 132.0 247.0 255.0 125.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 176.0 253.0 196.0 7.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 9.0 253.0 252.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 98.0 253.0 252.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 9.0 132.0 246.0 253.0 182.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 146.0 253.0 227.0 148.0 131.0 123.0 201.0 253.0 253.0 212.0 27.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 155.0 252.0 252.0 252.0 253.0 252.0 252.0 231.0 124.0 27.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 7.0 74.0 126.0 214.0 236.0 252.0 252.0 145.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 14.0 140.0 252.0 231.0 28.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 50.0 244.0 252.0 42.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 124.0 62.0 0.0 0.0 0.0 0.0 0.0 50.0 245.0 253.0 42.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 84.0 242.0 27.0 0.0 0.0 0.0 36.0 146.0 211.0 252.0 252.0 42.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 176.0 252.0 22.0 22.0 31.0 127.0 223.0 253.0 252.0 242.0 134.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 22.0 252.0 252.0 253.0 252.0 252.0 252.0 252.0 190.0 110.0 42.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 182.0 252.0 253.0 252.0 155.0 147.0 59.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 68.0 197.0 255.0 242.0 145.0 236.0 212.0 169.0 130.0 130.0 130.0 95.0 107.0 130.0 85.0 116.0 70.0 76.0 7.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 125.0 248.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 12.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 60.0 111.0 111.0 111.0 111.0 111.0 111.0 138.0 235.0 235.0 235.0 241.0 238.0 241.0 253.0 253.0 253.0 253.0 60.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 34.0 18.0 48.0 239.0 253.0 242.0 170.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 109.0 253.0 253.0 141.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 74.0 240.0 253.0 219.0 60.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 47.0 86.0 44.0 44.0 44.0 11.0 0.0 75.0 239.0 253.0 236.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 22.0 224.0 253.0 253.0 253.0 253.0 193.0 174.0 238.0 253.0 253.0 173.0 50.0 28.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 25.0 206.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 221.0 180.0 31.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 10.0 68.0 128.0 155.0 237.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 99.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 43.0 237.0 253.0 253.0 198.0 142.0 61.0 61.0 61.0 61.0 61.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 15.0 175.0 253.0 253.0 158.0 11.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 150.0 253.0 253.0 98.0 11.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 79.0 240.0 253.0 159.0 11.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 33.0 241.0 253.0 205.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 87.0 253.0 234.0 60.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 81.0 245.0 253.0 92.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 79.0 247.0 253.0 234.0 45.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 18.0 249.0 253.0 236.0 52.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 19.0 253.0 253.0 155.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 219.0 81.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 218.0 144.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 19.0 121.0 11.0 0.0 0.0 218.0 144.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 37.0 254.0 72.0 0.0 0.0 218.0 144.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 37.0 254.0 72.0 0.0 0.0 218.0 144.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 102.0 254.0 99.0 0.0 0.0 193.0 171.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 140.0 254.0 79.0 0.0 0.0 128.0 235.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 8.0 223.0 251.0 62.0 0.0 0.0 128.0 235.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 132.0 254.0 250.0 135.0 110.0 110.0 214.0 164.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 236.0 254.0 254.0 254.0 255.0 254.0 254.0 144.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 237.0 254.0 197.0 85.0 59.0 59.0 232.0 145.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 185.0 76.0 4.0 0.0 0.0 32.0 238.0 144.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 36.0 241.0 144.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 55.0 254.0 144.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 55.0 254.0 144.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 81.0 254.0 87.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 145.0 254.0 54.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 145.0 254.0 54.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 145.0 225.0 12.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 114.0 120.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 101.0 147.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 40.0 252.0 175.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 213.0 252.0 132.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 147.0 250.0 143.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 80.0 252.0 98.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 165.0 221.0 14.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 20.0 19.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 74.0 243.0 110.0 0.0 0.0 0.0 0.0 0.0 0.0 10.0 127.0 236.0 236.0 173.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 151.0 197.0 0.0 0.0 0.0 0.0 0.0 0.0 60.0 236.0 252.0 252.0 252.0 248.0 61.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 242.0 163.0 0.0 0.0 0.0 0.0 0.0 11.0 199.0 252.0 168.0 66.0 212.0 249.0 69.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 44.0 227.0 12.0 0.0 0.0 0.0 0.0 0.0 177.0 252.0 166.0 2.0 0.0 198.0 241.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 162.0 217.0 0.0 0.0 0.0 0.0 0.0 63.0 255.0 201.0 19.0 0.0 0.0 151.0 242.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 209.0 149.0 0.0 0.0 0.0 0.0 0.0 187.0 253.0 77.0 0.0 0.0 0.0 198.0 164.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 209.0 187.0 0.0 0.0 0.0 0.0 0.0 220.0 226.0 13.0 0.0 0.0 46.0 243.0 131.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 209.0 121.0 0.0 0.0 0.0 0.0 41.0 237.0 211.0 0.0 0.0 12.0 206.0 252.0 26.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 209.0 192.0 0.0 0.0 0.0 0.0 78.0 252.0 111.0 0.0 0.0 119.0 252.0 170.0 8.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 209.0 230.0 0.0 0.0 0.0 0.0 78.0 252.0 111.0 0.0 79.0 250.0 252.0 55.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 105.0 250.0 132.0 0.0 0.0 0.0 78.0 252.0 164.0 40.0 221.0 237.0 60.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 175.0 231.0 154.0 13.0 0.0 97.0 252.0 253.0 252.0 252.0 121.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 92.0 226.0 252.0 193.0 187.0 236.0 252.0 253.0 252.0 252.0 87.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 46.0 142.0 243.0 252.0 219.0 142.0 157.0 223.0 100.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 13.0 183.0 255.0 46.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 89.0 136.0 253.0 232.0 29.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 101.0 238.0 253.0 248.0 46.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 9.0 84.0 45.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 205.0 253.0 231.0 79.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 54.0 185.0 246.0 78.0 0.0 0.0 0.0 0.0 0.0 0.0 85.0 86.0 230.0 186.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 26.0 233.0 163.0 55.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 63.0 156.0 231.0 57.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 135.0 142.0 208.0 23.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 214.0 253.0 141.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 47.0 253.0 253.0 67.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 59.0 223.0 253.0 129.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 47.0 253.0 253.0 67.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 51.0 188.0 253.0 85.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 69.0 253.0 253.0 147.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 47.0 38.0 239.0 205.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 68.0 253.0 253.0 253.0 196.0 99.0 12.0 0.0 0.0 61.0 59.0 187.0 215.0 251.0 175.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 124.0 252.0 253.0 253.0 253.0 250.0 249.0 249.0 252.0 252.0 253.0 253.0 253.0 158.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 117.0 194.0 253.0 253.0 253.0 253.0 253.0 235.0 199.0 253.0 253.0 170.0 47.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 26.0 148.0 125.0 15.0 15.0 12.0 6.0 54.0 253.0 184.0 39.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 12.0 177.0 253.0 72.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 139.0 237.0 253.0 72.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 194.0 253.0 232.0 24.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 203.0 186.0 133.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 249.0 167.0 92.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 130.0 12.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 128.0 128.0 128.0 255.0 128.0 255.0 191.0 128.0 64.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 255.0 255.0 191.0 255.0 255.0 255.0 255.0 255.0 255.0 255.0 64.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 255.0 255.0 255.0 255.0 255.0 255.0 255.0 255.0 255.0 255.0 255.0 64.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 128.0 128.0 128.0 128.0 64.0 0.0 128.0 191.0 255.0 255.0 255.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 255.0 255.0 255.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 128.0 128.0 191.0 255.0 255.0 255.0 64.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 255.0 255.0 255.0 255.0 255.0 255.0 191.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 255.0 255.0 255.0 255.0 255.0 255.0 191.0 64.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 255.0 255.0 255.0 255.0 255.0 255.0 255.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 255.0 255.0 255.0 255.0 255.0 255.0 255.0 191.0 64.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 191.0 255.0 255.0 255.0 255.0 255.0 255.0 255.0 255.0 191.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 128.0 128.0 128.0 128.0 255.0 255.0 255.0 255.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 255.0 255.0 255.0 191.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 255.0 255.0 255.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 0.0 0.0 0.0 0.0 255.0 255.0 255.0 255.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 255.0 191.0 0.0 64.0 255.0 255.0 255.0 255.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 191.0 255.0 255.0 191.0 255.0 255.0 255.0 255.0 255.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 255.0 255.0 255.0 255.0 255.0 255.0 255.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 255.0 255.0 255.0 255.0 255.0 255.0 64.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 191.0 255.0 255.0 255.0 128.0 64.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 14.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 111.0 217.0 232.0 132.0 57.0 92.0 92.0 92.0 92.0 43.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 159.0 252.0 254.0 254.0 254.0 252.0 254.0 254.0 254.0 254.0 251.0 137.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 37.0 205.0 254.0 254.0 254.0 254.0 254.0 234.0 200.0 133.0 133.0 197.0 242.0 254.0 178.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 32.0 224.0 254.0 224.0 200.0 124.0 138.0 200.0 32.0 0.0 0.0 0.0 0.0 38.0 180.0 254.0 129.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 17.0 223.0 254.0 239.0 33.0 4.0 0.0 0.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 8.0 235.0 240.0 113.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 119.0 254.0 249.0 67.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 84.0 254.0 254.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 63.0 254.0 254.0 98.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 68.0 254.0 254.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 208.0 254.0 236.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 68.0 254.0 254.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 252.0 117.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 73.0 254.0 248.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 244.0 46.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 254.0 194.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 254.0 67.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 247.0 254.0 141.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 254.0 74.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 76.0 222.0 254.0 232.0 36.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 163.0 254.0 254.0 95.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 40.0 113.0 192.0 254.0 254.0 207.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 30.0 222.0 254.0 248.0 185.0 134.0 99.0 62.0 134.0 134.0 134.0 200.0 243.0 254.0 254.0 233.0 139.0 9.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 28.0 162.0 252.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 248.0 126.0 27.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 55.0 172.0 186.0 186.0 212.0 186.0 186.0 186.0 122.0 91.0 53.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 16.0 13.0 13.0 44.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 222.0 251.0 251.0 251.0 229.0 244.0 251.0 251.0 252.0 207.0 208.0 241.0 234.0 183.0 128.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 181.0 253.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 249.0 183.0 160.0 100.0 24.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 12.0 13.0 13.0 13.0 13.0 13.0 13.0 88.0 99.0 141.0 115.0 138.0 239.0 254.0 254.0 254.0 254.0 255.0 106.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 13.0 54.0 168.0 237.0 254.0 254.0 249.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 54.0 237.0 254.0 254.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 27.0 223.0 254.0 176.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 146.0 255.0 254.0 105.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 42.0 222.0 254.0 159.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 26.0 223.0 254.0 238.0 65.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 27.0 210.0 254.0 253.0 77.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 191.0 254.0 252.0 92.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 139.0 254.0 254.0 187.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 75.0 243.0 254.0 190.0 14.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 24.0 228.0 254.0 229.0 35.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 24.0 208.0 254.0 254.0 56.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 195.0 254.0 254.0 135.0 15.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 110.0 254.0 254.0 165.0 15.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 193.0 254.0 178.0 31.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 43.0 68.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 86.0 254.0 254.0 254.0 254.0 135.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 90.0 250.0 253.0 253.0 253.0 253.0 252.0 248.0 160.0 118.0 45.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 216.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 232.0 103.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 144.0 251.0 253.0 253.0 224.0 48.0 49.0 170.0 253.0 253.0 253.0 253.0 234.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 95.0 251.0 253.0 253.0 182.0 18.0 0.0 0.0 6.0 49.0 170.0 253.0 253.0 251.0 149.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 88.0 225.0 253.0 253.0 253.0 61.0 0.0 0.0 0.0 0.0 0.0 26.0 221.0 253.0 253.0 245.0 42.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 40.0 245.0 253.0 253.0 253.0 137.0 7.0 0.0 0.0 0.0 0.0 0.0 0.0 42.0 221.0 253.0 253.0 117.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 118.0 253.0 253.0 253.0 225.0 27.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 156.0 253.0 253.0 117.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 118.0 253.0 253.0 253.0 58.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 156.0 253.0 253.0 117.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 151.0 253.0 253.0 177.0 8.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 156.0 253.0 253.0 217.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 248.0 253.0 253.0 58.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 156.0 253.0 253.0 247.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 154.0 253.0 253.0 120.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 156.0 253.0 253.0 220.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 208.0 253.0 253.0 155.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 174.0 253.0 253.0 117.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 160.0 253.0 253.0 155.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 7.0 134.0 253.0 253.0 253.0 117.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 118.0 253.0 253.0 155.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 67.0 253.0 253.0 253.0 252.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 45.0 246.0 253.0 216.0 33.0 0.0 0.0 0.0 0.0 7.0 27.0 134.0 253.0 253.0 253.0 251.0 148.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 241.0 253.0 253.0 216.0 40.0 128.0 150.0 150.0 174.0 253.0 253.0 253.0 253.0 251.0 215.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 105.0 243.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 153.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 229.0 253.0 253.0 253.0 250.0 253.0 253.0 221.0 210.0 156.0 183.0 117.0 45.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 161.0 139.0 234.0 83.0 123.0 123.0 95.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 47.0 136.0 241.0 254.0 254.0 254.0 254.0 254.0 255.0 202.0 130.0 8.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 33.0 228.0 253.0 253.0 253.0 253.0 231.0 135.0 191.0 218.0 234.0 253.0 195.0 54.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 43.0 240.0 253.0 253.0 252.0 189.0 31.0 0.0 0.0 0.0 37.0 145.0 253.0 178.0 15.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 82.0 182.0 182.0 68.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 141.0 253.0 158.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 182.0 241.0 85.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 117.0 253.0 170.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 48.0 253.0 170.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 48.0 253.0 170.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 123.0 253.0 170.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 166.0 253.0 88.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 10.0 192.0 203.0 12.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 114.0 253.0 188.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 12.0 253.0 253.0 81.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 54.0 130.0 17.0 6.0 0.0 0.0 0.0 0.0 6.0 189.0 253.0 146.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 32.0 177.0 253.0 253.0 253.0 194.0 148.0 121.0 7.0 0.0 127.0 253.0 236.0 37.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 24.0 184.0 253.0 215.0 102.0 201.0 210.0 253.0 253.0 186.0 166.0 246.0 251.0 127.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 36.0 253.0 202.0 13.0 0.0 0.0 7.0 90.0 234.0 253.0 253.0 253.0 241.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 36.0 253.0 239.0 105.0 10.0 0.0 47.0 157.0 238.0 253.0 253.0 253.0 251.0 132.0 29.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 22.0 174.0 253.0 253.0 223.0 219.0 238.0 253.0 253.0 223.0 54.0 88.0 251.0 253.0 134.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 50.0 232.0 253.0 253.0 253.0 234.0 108.0 12.0 0.0 0.0 83.0 253.0 250.0 121.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 45.0 154.0 208.0 248.0 230.0 254.0 255.0 138.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 40.0 205.0 254.0 254.0 254.0 254.0 254.0 254.0 213.0 31.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 17.0 210.0 254.0 254.0 254.0 254.0 236.0 254.0 254.0 254.0 125.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 98.0 254.0 254.0 254.0 152.0 40.0 26.0 151.0 254.0 254.0 168.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 166.0 254.0 254.0 202.0 44.0 0.0 10.0 207.0 254.0 254.0 205.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 53.0 252.0 254.0 242.0 83.0 136.0 180.0 254.0 254.0 254.0 125.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 189.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 63.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 56.0 209.0 254.0 254.0 254.0 254.0 254.0 201.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 88.0 228.0 254.0 254.0 254.0 238.0 92.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 103.0 248.0 254.0 254.0 254.0 61.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 91.0 248.0 254.0 254.0 253.0 166.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 100.0 230.0 254.0 254.0 170.0 113.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 95.0 253.0 254.0 254.0 229.0 16.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 95.0 227.0 254.0 254.0 254.0 133.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 38.0 228.0 254.0 254.0 254.0 202.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 193.0 254.0 254.0 254.0 202.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 91.0 246.0 254.0 254.0 242.0 90.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 35.0 242.0 254.0 254.0 254.0 141.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 214.0 254.0 254.0 185.0 23.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 183.0 254.0 247.0 24.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 23.0 219.0 255.0 105.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 42.0 253.0 253.0 158.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 67.0 253.0 253.0 158.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 160.0 253.0 253.0 158.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 160.0 253.0 253.0 158.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 160.0 253.0 253.0 158.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 160.0 253.0 253.0 158.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 160.0 253.0 253.0 158.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 86.0 253.0 253.0 218.0 15.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 42.0 253.0 253.0 253.0 23.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 42.0 253.0 253.0 253.0 23.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 42.0 253.0 253.0 253.0 23.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 42.0 253.0 253.0 253.0 23.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 42.0 253.0 253.0 205.0 11.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 42.0 253.0 253.0 158.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 253.0 253.0 158.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 12.0 203.0 253.0 253.0 74.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 160.0 253.0 192.0 9.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 241.0 253.0 176.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 111.0 170.0 149.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 38.0 226.0 214.0 19.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 14.0 25.0 25.0 19.0 0.0 0.0 0.0 11.0 25.0 13.0 25.0 25.0 48.0 223.0 253.0 245.0 32.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 145.0 253.0 253.0 230.0 65.0 135.0 157.0 199.0 253.0 209.0 253.0 253.0 253.0 253.0 253.0 151.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 118.0 212.0 221.0 205.0 219.0 230.0 253.0 253.0 253.0 254.0 253.0 253.0 253.0 253.0 181.0 16.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 24.0 0.0 21.0 38.0 72.0 72.0 72.0 72.0 72.0 184.0 253.0 239.0 46.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 7.0 185.0 253.0 101.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 124.0 253.0 253.0 72.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 145.0 253.0 235.0 45.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 95.0 110.0 110.0 110.0 192.0 253.0 249.0 143.0 110.0 110.0 167.0 63.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 82.0 252.0 253.0 253.0 254.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 87.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 105.0 231.0 242.0 244.0 254.0 254.0 246.0 184.0 149.0 81.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 13.0 253.0 250.0 76.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 13.0 253.0 217.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 94.0 253.0 217.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 133.0 253.0 217.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 226.0 253.0 182.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 253.0 96.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 253.0 96.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 253.0 96.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 81.0 242.0 51.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 54.0 175.0 230.0 254.0 132.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 66.0 236.0 209.0 245.0 254.0 242.0 59.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 41.0 236.0 206.0 53.0 33.0 147.0 254.0 150.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 181.0 218.0 8.0 0.0 0.0 32.0 242.0 113.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 72.0 105.0 2.0 0.0 0.0 32.0 236.0 75.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 16.0 160.0 222.0 80.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 10.0 215.0 254.0 151.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 62.0 217.0 254.0 173.0 24.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 8.0 143.0 250.0 254.0 245.0 44.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 131.0 254.0 254.0 254.0 254.0 192.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 45.0 224.0 239.0 164.0 229.0 151.0 175.0 126.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 28.0 228.0 254.0 170.0 45.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 9.0 148.0 254.0 134.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 8.0 220.0 179.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 184.0 239.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 254.0 154.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 35.0 10.0 0.0 0.0 0.0 0.0 0.0 4.0 87.0 207.0 254.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 12.0 162.0 120.0 0.0 0.0 0.0 0.0 3.0 148.0 254.0 254.0 174.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 28.0 245.0 208.0 36.0 12.0 24.0 89.0 225.0 254.0 254.0 198.0 17.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 189.0 255.0 247.0 241.0 244.0 254.0 255.0 234.0 80.0 7.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 37.0 128.0 140.0 140.0 140.0 58.0 16.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 47.0 118.0 194.0 253.0 253.0 253.0 253.0 253.0 253.0 215.0 80.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 102.0 198.0 253.0 229.0 155.0 33.0 20.0 20.0 42.0 124.0 251.0 247.0 162.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 63.0 236.0 243.0 105.0 6.0 0.0 0.0 0.0 0.0 0.0 0.0 105.0 253.0 244.0 51.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 242.0 253.0 126.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 199.0 253.0 72.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 253.0 114.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 192.0 253.0 72.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 103.0 64.0 19.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 35.0 244.0 227.0 12.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 127.0 253.0 137.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 120.0 253.0 142.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 69.0 253.0 213.0 27.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 120.0 230.0 183.0 28.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 22.0 160.0 250.0 180.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 194.0 253.0 207.0 79.0 16.0 32.0 0.0 0.0 0.0 0.0 0.0 0.0 18.0 47.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 13.0 154.0 250.0 253.0 253.0 253.0 233.0 235.0 223.0 228.0 228.0 228.0 201.0 129.0 234.0 243.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 69.0 253.0 130.0 83.0 83.0 83.0 83.0 69.0 141.0 143.0 154.0 91.0 214.0 143.0 229.0 253.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 36.0 19.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 15.0 0.0 23.0 36.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 70.0 202.0 255.0 126.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 72.0 239.0 253.0 253.0 253.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 17.0 242.0 253.0 193.0 166.0 253.0 13.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 52.0 202.0 253.0 180.0 7.0 60.0 253.0 119.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 72.0 211.0 248.0 103.0 14.0 0.0 60.0 253.0 153.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 66.0 244.0 250.0 134.0 0.0 9.0 123.0 233.0 253.0 175.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 16.0 232.0 253.0 146.0 52.0 157.0 233.0 253.0 253.0 253.0 52.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 54.0 245.0 253.0 208.0 249.0 253.0 253.0 253.0 253.0 220.0 7.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 220.0 253.0 253.0 240.0 253.0 253.0 252.0 186.0 13.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 43.0 92.0 92.0 47.0 253.0 253.0 139.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 164.0 253.0 141.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 82.0 252.0 253.0 54.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 158.0 253.0 217.0 18.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 40.0 242.0 247.0 77.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 153.0 253.0 226.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 8.0 223.0 253.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 253.0 253.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 118.0 253.0 253.0 58.0 118.0 54.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 43.0 253.0 253.0 253.0 238.0 39.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 171.0 253.0 200.0 68.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 32.0 118.0 207.0 254.0 254.0 254.0 255.0 254.0 138.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 74.0 116.0 234.0 234.0 234.0 234.0 239.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 228.0 37.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 29.0 191.0 244.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 96.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 97.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 222.0 23.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 84.0 248.0 253.0 253.0 253.0 253.0 253.0 253.0 244.0 219.0 219.0 145.0 253.0 253.0 253.0 253.0 212.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 86.0 131.0 221.0 103.0 103.0 103.0 103.0 75.0 0.0 0.0 15.0 253.0 253.0 253.0 253.0 212.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 86.0 200.0 253.0 253.0 253.0 253.0 141.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 203.0 253.0 253.0 253.0 253.0 133.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 25.0 195.0 253.0 253.0 253.0 253.0 253.0 54.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 25.0 194.0 253.0 253.0 253.0 253.0 225.0 139.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 190.0 253.0 253.0 253.0 253.0 230.0 47.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 87.0 244.0 253.0 253.0 253.0 249.0 46.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 8.0 144.0 251.0 253.0 253.0 253.0 249.0 165.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 82.0 253.0 253.0 253.0 253.0 253.0 89.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 89.0 248.0 253.0 253.0 253.0 253.0 151.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 93.0 243.0 253.0 253.0 253.0 253.0 193.0 9.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 192.0 253.0 253.0 253.0 253.0 231.0 65.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 87.0 240.0 253.0 253.0 253.0 212.0 26.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 161.0 253.0 253.0 253.0 78.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 16.0 124.0 253.0 119.0 12.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 123.0 174.0 51.0 14.0 0.0 8.0 78.0 236.0 49.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 253.0 252.0 252.0 211.0 190.0 201.0 252.0 252.0 163.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 253.0 252.0 252.0 252.0 252.0 253.0 252.0 252.0 247.0 38.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 71.0 253.0 252.0 98.0 154.0 215.0 253.0 252.0 252.0 252.0 42.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 106.0 253.0 252.0 21.0 0.0 18.0 42.0 42.0 236.0 252.0 42.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 107.0 255.0 253.0 21.0 0.0 0.0 0.0 0.0 233.0 253.0 60.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 106.0 253.0 252.0 21.0 0.0 0.0 0.0 0.0 232.0 252.0 147.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 106.0 253.0 252.0 21.0 0.0 0.0 0.0 0.0 232.0 252.0 147.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 80.0 227.0 252.0 21.0 0.0 0.0 0.0 0.0 232.0 252.0 147.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 42.0 147.0 12.0 0.0 0.0 0.0 0.0 232.0 252.0 147.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 233.0 253.0 147.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 232.0 252.0 147.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 232.0 252.0 147.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 232.0 252.0 147.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 232.0 252.0 147.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 233.0 253.0 209.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 232.0 252.0 252.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 232.0 252.0 252.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 232.0 252.0 252.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 47.0 217.0 164.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 79.0 168.0 140.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 82.0 198.0 243.0 254.0 254.0 15.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 88.0 253.0 254.0 254.0 254.0 254.0 15.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 50.0 254.0 254.0 254.0 254.0 207.0 134.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 8.0 176.0 254.0 254.0 238.0 105.0 9.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 145.0 255.0 254.0 251.0 30.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 19.0 214.0 254.0 225.0 47.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 199.0 254.0 251.0 103.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 235.0 255.0 151.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 235.0 254.0 134.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 67.0 251.0 226.0 40.0 0.0 0.0 0.0 0.0 17.0 100.0 197.0 171.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 70.0 251.0 181.0 0.0 0.0 0.0 0.0 75.0 249.0 254.0 254.0 254.0 103.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 235.0 181.0 0.0 0.0 0.0 19.0 221.0 254.0 254.0 254.0 254.0 234.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 235.0 181.0 0.0 0.0 0.0 108.0 254.0 254.0 244.0 167.0 216.0 234.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 235.0 204.0 10.0 0.0 2.0 186.0 254.0 242.0 73.0 10.0 205.0 234.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 226.0 255.0 134.0 8.0 6.0 254.0 254.0 119.0 0.0 92.0 254.0 174.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 103.0 254.0 254.0 175.0 72.0 254.0 254.0 147.0 105.0 250.0 254.0 26.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 181.0 253.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 183.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 134.0 254.0 254.0 254.0 254.0 254.0 234.0 184.0 27.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 72.0 238.0 233.0 150.0 133.0 30.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 18.0 18.0 55.0 137.0 192.0 131.0 8.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 16.0 95.0 164.0 254.0 254.0 254.0 254.0 254.0 254.0 178.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 41.0 151.0 207.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 225.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 190.0 254.0 254.0 254.0 254.0 209.0 155.0 65.0 65.0 148.0 254.0 247.0 66.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 69.0 238.0 254.0 166.0 47.0 18.0 0.0 0.0 0.0 114.0 254.0 254.0 89.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 24.0 29.0 2.0 0.0 0.0 0.0 0.0 0.0 114.0 254.0 254.0 89.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 8.0 250.0 254.0 89.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 114.0 254.0 254.0 89.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 188.0 254.0 250.0 74.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 67.0 248.0 254.0 225.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 187.0 254.0 251.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 29.0 229.0 254.0 243.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 27.0 211.0 254.0 254.0 243.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 46.0 228.0 250.0 250.0 250.0 250.0 251.0 254.0 254.0 254.0 65.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 68.0 254.0 254.0 254.0 254.0 254.0 254.0 255.0 254.0 254.0 254.0 145.0 27.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 46.0 226.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 244.0 80.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 154.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 239.0 98.0 170.0 218.0 254.0 254.0 241.0 154.0 14.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 154.0 254.0 254.0 254.0 254.0 254.0 254.0 182.0 41.0 0.0 0.0 24.0 114.0 220.0 254.0 254.0 174.0 12.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 154.0 254.0 254.0 254.0 254.0 252.0 87.0 13.0 0.0 0.0 0.0 0.0 0.0 21.0 57.0 179.0 254.0 82.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 27.0 216.0 254.0 254.0 149.0 22.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 35.0 135.0 82.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 91.0 188.0 64.0 39.0 30.0 0.0 17.0 0.0 17.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 196.0 254.0 254.0 254.0 240.0 185.0 215.0 185.0 215.0 185.0 185.0 31.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 120.0 254.0 213.0 240.0 226.0 180.0 249.0 249.0 249.0 254.0 254.0 137.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 185.0 254.0 59.0 0.0 0.0 0.0 0.0 0.0 0.0 245.0 254.0 151.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 62.0 248.0 183.0 15.0 0.0 0.0 0.0 0.0 0.0 74.0 252.0 254.0 70.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 209.0 249.0 52.0 0.0 0.0 0.0 0.0 0.0 0.0 99.0 254.0 254.0 43.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 91.0 254.0 176.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 120.0 254.0 242.0 35.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 94.0 43.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 207.0 254.0 189.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 207.0 254.0 182.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 207.0 254.0 81.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 207.0 254.0 81.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 207.0 254.0 81.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 15.0 218.0 248.0 62.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 60.0 254.0 227.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 164.0 254.0 227.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 168.0 254.0 227.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 168.0 254.0 227.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 13.0 216.0 254.0 167.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 22.0 254.0 254.0 119.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 181.0 213.0 22.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 75.0 0.0 98.0 185.0 178.0 94.0 19.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 15.0 111.0 195.0 238.0 94.0 0.0 208.0 249.0 254.0 254.0 116.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 20.0 50.0 107.0 197.0 246.0 183.0 25.0 0.0 0.0 81.0 245.0 254.0 249.0 91.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 18.0 84.0 230.0 254.0 254.0 221.0 86.0 0.0 0.0 1.0 125.0 253.0 254.0 178.0 53.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 133.0 254.0 254.0 217.0 118.0 4.0 0.0 0.0 62.0 202.0 254.0 241.0 131.0 8.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 107.0 244.0 254.0 213.0 45.0 0.0 0.0 0.0 62.0 240.0 254.0 220.0 29.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 44.0 246.0 254.0 209.0 49.0 0.0 0.0 0.0 31.0 241.0 254.0 221.0 27.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 95.0 254.0 254.0 55.0 0.0 0.0 0.0 17.0 198.0 254.0 218.0 28.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 27.0 219.0 254.0 233.0 144.0 39.0 42.0 204.0 254.0 205.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 115.0 248.0 254.0 254.0 244.0 233.0 254.0 223.0 24.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 38.0 84.0 168.0 245.0 254.0 254.0 254.0 207.0 115.0 9.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 14.0 236.0 254.0 230.0 163.0 237.0 244.0 211.0 80.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 99.0 254.0 254.0 99.0 0.0 0.0 37.0 225.0 254.0 130.0 8.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 71.0 254.0 229.0 12.0 0.0 0.0 0.0 2.0 170.0 254.0 51.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 96.0 254.0 254.0 18.0 0.0 0.0 0.0 0.0 81.0 254.0 198.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 80.0 254.0 254.0 18.0 0.0 0.0 0.0 0.0 131.0 254.0 119.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 214.0 254.0 78.0 0.0 0.0 0.0 1.0 183.0 244.0 63.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 253.0 223.0 24.0 0.0 2.0 126.0 254.0 178.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 87.0 238.0 222.0 119.0 177.0 254.0 217.0 27.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 18.0 154.0 196.0 196.0 101.0 25.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 67.0 254.0 214.0 25.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 61.0 227.0 35.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 188.0 253.0 253.0 165.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 182.0 253.0 180.0 30.0 0.0 0.0 0.0 0.0 0.0 0.0 49.0 253.0 253.0 253.0 253.0 24.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 37.0 253.0 253.0 253.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 72.0 253.0 253.0 253.0 188.0 8.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 37.0 253.0 253.0 253.0 168.0 0.0 0.0 0.0 0.0 0.0 0.0 169.0 253.0 253.0 233.0 62.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 72.0 253.0 253.0 253.0 168.0 0.0 0.0 0.0 0.0 0.0 11.0 194.0 253.0 253.0 168.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 157.0 253.0 253.0 253.0 168.0 0.0 0.0 41.0 51.0 136.0 167.0 253.0 253.0 253.0 168.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 157.0 253.0 253.0 253.0 201.0 143.0 160.0 235.0 238.0 253.0 253.0 253.0 253.0 253.0 123.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 157.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 254.0 253.0 253.0 253.0 253.0 187.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 157.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 254.0 253.0 253.0 253.0 253.0 180.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 24.0 250.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 249.0 249.0 254.0 255.0 254.0 118.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 85.0 234.0 253.0 253.0 253.0 253.0 231.0 171.0 52.0 145.0 253.0 253.0 253.0 72.0 20.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 19.0 183.0 217.0 176.0 96.0 9.0 0.0 0.0 71.0 253.0 253.0 253.0 226.0 223.0 31.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 25.0 253.0 253.0 253.0 253.0 145.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 112.0 253.0 253.0 253.0 172.0 14.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 10.0 228.0 253.0 253.0 236.0 43.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 53.0 253.0 253.0 253.0 152.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 88.0 253.0 253.0 211.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 13.0 253.0 253.0 205.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 7.0 202.0 253.0 147.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 37.0 125.0 170.0 152.0 255.0 174.0 194.0 101.0 101.0 12.0 68.0 101.0 15.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 93.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 206.0 236.0 253.0 170.0 17.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 93.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 92.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 30.0 211.0 165.0 172.0 253.0 196.0 253.0 253.0 253.0 253.0 253.0 253.0 92.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 34.0 4.0 8.0 61.0 24.0 61.0 154.0 253.0 253.0 253.0 206.0 22.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 124.0 253.0 253.0 253.0 191.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 22.0 246.0 253.0 253.0 214.0 34.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 136.0 253.0 253.0 253.0 137.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 41.0 216.0 253.0 253.0 245.0 67.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 218.0 253.0 253.0 253.0 97.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 104.0 246.0 253.0 253.0 204.0 25.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 107.0 253.0 253.0 253.0 253.0 109.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 185.0 253.0 253.0 247.0 109.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 185.0 253.0 253.0 230.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 185.0 253.0 253.0 230.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 73.0 243.0 253.0 253.0 192.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 90.0 253.0 253.0 251.0 74.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 173.0 253.0 253.0 176.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 67.0 238.0 253.0 49.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 185.0 253.0 22.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 68.0 156.0 253.0 253.0 255.0 253.0 253.0 253.0 165.0 18.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 112.0 237.0 252.0 252.0 252.0 253.0 252.0 252.0 252.0 252.0 106.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 135.0 231.0 231.0 160.0 38.0 21.0 21.0 40.0 252.0 252.0 106.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 48.0 252.0 252.0 106.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 36.0 223.0 252.0 208.0 18.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 25.0 157.0 253.0 243.0 35.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 36.0 183.0 252.0 252.0 237.0 102.0 36.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 20.0 127.0 223.0 253.0 252.0 252.0 252.0 252.0 242.0 153.0 19.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 153.0 252.0 252.0 216.0 153.0 84.0 154.0 215.0 253.0 252.0 202.0 21.0 0.0 0.0 0.0 0.0 43.0 11.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 100.0 252.0 164.0 18.0 0.0 0.0 0.0 18.0 122.0 252.0 252.0 225.0 35.0 0.0 0.0 107.0 141.0 7.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 36.0 224.0 253.0 122.0 105.0 227.0 223.0 35.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 92.0 252.0 252.0 253.0 189.0 32.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 8.0 85.0 252.0 252.0 161.0 14.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 55.0 197.0 252.0 252.0 252.0 106.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 89.0 236.0 252.0 252.0 252.0 252.0 18.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 69.0 236.0 212.0 76.0 245.0 253.0 191.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 101.0 252.0 217.0 41.0 185.0 252.0 252.0 68.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 43.0 234.0 252.0 112.0 192.0 252.0 251.0 134.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 85.0 252.0 252.0 252.0 253.0 252.0 134.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 85.0 252.0 252.0 252.0 191.0 112.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 45.0 174.0 254.0 93.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 199.0 253.0 253.0 253.0 11.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 79.0 253.0 200.0 96.0 206.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 33.0 230.0 253.0 168.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 78.0 253.0 236.0 71.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 169.0 253.0 146.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 30.0 238.0 253.0 60.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 37.0 253.0 253.0 60.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 146.0 253.0 253.0 60.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 157.0 253.0 253.0 60.0 0.0 0.0 0.0 0.0 0.0 0.0 76.0 202.0 155.0 29.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 158.0 254.0 254.0 60.0 0.0 0.0 0.0 0.0 1.0 82.0 209.0 254.0 254.0 220.0 31.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 157.0 253.0 253.0 60.0 0.0 0.0 0.0 0.0 82.0 253.0 253.0 253.0 253.0 253.0 217.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 140.0 253.0 253.0 60.0 0.0 0.0 0.0 18.0 209.0 253.0 231.0 136.0 96.0 216.0 253.0 111.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 37.0 253.0 253.0 60.0 0.0 0.0 0.0 144.0 254.0 214.0 32.0 0.0 0.0 194.0 253.0 156.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 28.0 233.0 253.0 89.0 0.0 0.0 165.0 250.0 246.0 31.0 0.0 0.0 0.0 194.0 253.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 135.0 253.0 236.0 72.0 28.0 237.0 253.0 116.0 0.0 0.0 14.0 102.0 239.0 188.0 9.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 33.0 229.0 253.0 237.0 224.0 253.0 253.0 0.0 0.0 53.0 175.0 253.0 253.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 55.0 231.0 253.0 253.0 253.0 253.0 213.0 166.0 240.0 253.0 253.0 144.0 7.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 111.0 233.0 253.0 253.0 253.0 254.0 253.0 253.0 232.0 116.0 6.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 9.0 116.0 132.0 248.0 254.0 242.0 132.0 49.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 119.0 254.0 215.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 118.0 253.0 213.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 118.0 253.0 213.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 10.0 138.0 253.0 213.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 134.0 253.0 253.0 213.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 253.0 253.0 93.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 167.0 255.0 253.0 103.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 43.0 213.0 254.0 216.0 53.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 43.0 200.0 253.0 254.0 135.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 79.0 253.0 253.0 254.0 135.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 20.0 254.0 254.0 254.0 243.0 105.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 171.0 253.0 253.0 223.0 63.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 79.0 253.0 253.0 254.0 135.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 19.0 240.0 253.0 253.0 200.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 96.0 253.0 253.0 253.0 121.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 215.0 253.0 253.0 253.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 133.0 247.0 253.0 253.0 237.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 156.0 253.0 253.0 253.0 57.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 156.0 253.0 253.0 253.0 57.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 36.0 73.0 192.0 57.0 13.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 115.0 196.0 254.0 254.0 254.0 156.0 17.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 65.0 203.0 253.0 253.0 251.0 248.0 253.0 253.0 159.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 8.0 137.0 249.0 253.0 241.0 147.0 68.0 41.0 117.0 246.0 253.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 109.0 253.0 242.0 157.0 29.0 0.0 0.0 2.0 115.0 250.0 247.0 18.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 22.0 145.0 36.0 0.0 0.0 0.0 0.0 45.0 253.0 253.0 106.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 111.0 153.0 240.0 253.0 219.0 7.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 84.0 253.0 253.0 253.0 230.0 47.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 148.0 239.0 248.0 253.0 253.0 253.0 250.0 99.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 239.0 253.0 253.0 252.0 181.0 253.0 253.0 248.0 95.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 44.0 4.0 4.0 1.0 50.0 184.0 253.0 252.0 78.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 14.0 228.0 253.0 121.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 126.0 253.0 219.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 130.0 253.0 213.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 108.0 93.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 224.0 253.0 120.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 32.0 236.0 167.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 120.0 250.0 253.0 70.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 65.0 253.0 178.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 47.0 253.0 253.0 165.0 6.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 31.0 235.0 178.0 0.0 0.0 0.0 0.0 0.0 17.0 158.0 243.0 253.0 203.0 6.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 219.0 235.0 138.0 90.0 90.0 91.0 149.0 216.0 253.0 248.0 163.0 19.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 162.0 253.0 253.0 253.0 253.0 254.0 253.0 235.0 146.0 24.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 26.0 123.0 165.0 253.0 198.0 153.0 134.0 32.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 14.0 141.0 224.0 79.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 186.0 253.0 253.0 117.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 99.0 254.0 171.0 115.0 36.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 52.0 248.0 244.0 40.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 31.0 219.0 253.0 45.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 119.0 254.0 171.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 103.0 253.0 212.0 9.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 19.0 196.0 228.0 43.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 149.0 253.0 174.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 194.0 253.0 100.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 23.0 255.0 174.0 0.0 0.0 0.0 0.0 50.0 97.0 59.0 14.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 180.0 254.0 135.0 0.0 0.0 53.0 215.0 247.0 253.0 253.0 185.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 195.0 254.0 135.0 0.0 88.0 235.0 254.0 216.0 107.0 172.0 253.0 68.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 195.0 254.0 135.0 88.0 251.0 253.0 154.0 25.0 0.0 136.0 253.0 173.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 195.0 254.0 150.0 235.0 237.0 118.0 0.0 0.0 0.0 136.0 253.0 98.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 99.0 255.0 254.0 254.0 154.0 0.0 0.0 0.0 0.0 137.0 254.0 23.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 15.0 208.0 253.0 253.0 124.0 0.0 13.0 20.0 20.0 183.0 245.0 53.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 127.0 253.0 253.0 241.0 175.0 224.0 253.0 253.0 253.0 126.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 110.0 241.0 253.0 253.0 254.0 253.0 253.0 216.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 41.0 163.0 253.0 254.0 253.0 222.0 94.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 116.0 243.0 224.0 246.0 59.0 0.0 31.0 121.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 149.0 191.0 95.0 8.0 158.0 25.0 17.0 219.0 228.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 14.0 173.0 149.0 56.0 0.0 0.0 61.0 5.0 198.0 228.0 44.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 86.0 200.0 25.0 0.0 0.0 0.0 0.0 66.0 203.0 75.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 125.0 138.0 0.0 0.0 0.0 0.0 43.0 243.0 230.0 46.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 139.0 201.0 6.0 0.0 0.0 0.0 0.0 149.0 252.0 84.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 88.0 228.0 10.0 0.0 0.0 0.0 18.0 152.0 253.0 139.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 225.0 96.0 0.0 0.0 2.0 68.0 194.0 224.0 110.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 49.0 229.0 20.0 28.0 60.0 151.0 255.0 249.0 71.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 41.0 249.0 206.0 253.0 221.0 206.0 246.0 202.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 106.0 196.0 123.0 16.0 135.0 246.0 142.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 110.0 254.0 198.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 29.0 250.0 237.0 25.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 219.0 210.0 24.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 112.0 244.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 244.0 124.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 94.0 233.0 164.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 211.0 222.0 9.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 211.0 125.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 24.0 90.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 110.0 125.0 125.0 125.0 158.0 158.0 125.0 38.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 157.0 254.0 254.0 254.0 254.0 255.0 254.0 254.0 251.0 83.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 172.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 247.0 144.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 8.0 104.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 222.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 10.0 25.0 133.0 184.0 254.0 254.0 254.0 254.0 254.0 222.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 184.0 232.0 254.0 254.0 254.0 254.0 254.0 222.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 117.0 248.0 254.0 254.0 254.0 254.0 254.0 254.0 111.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 216.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 131.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 88.0 242.0 254.0 254.0 254.0 254.0 254.0 254.0 222.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 89.0 241.0 254.0 205.0 236.0 254.0 254.0 230.0 26.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 52.0 65.0 17.0 153.0 254.0 254.0 254.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 53.0 254.0 254.0 254.0 228.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 77.0 254.0 254.0 254.0 137.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 40.0 231.0 254.0 254.0 254.0 98.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 17.0 0.0 0.0 0.0 9.0 152.0 254.0 254.0 254.0 233.0 35.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 142.0 207.0 157.0 50.0 131.0 182.0 254.0 254.0 254.0 254.0 208.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 63.0 244.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 251.0 84.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 106.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 245.0 136.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 49.0 235.0 254.0 254.0 254.0 254.0 254.0 250.0 221.0 36.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 109.0 235.0 254.0 254.0 221.0 32.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 92.0 253.0 253.0 253.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 190.0 251.0 251.0 251.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 190.0 251.0 251.0 251.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 190.0 251.0 251.0 251.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 190.0 251.0 251.0 251.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 191.0 253.0 253.0 253.0 195.0 24.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 190.0 251.0 251.0 251.0 253.0 62.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 190.0 251.0 251.0 251.0 253.0 141.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 51.0 251.0 251.0 251.0 253.0 220.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 32.0 251.0 251.0 251.0 253.0 220.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 12.0 174.0 253.0 253.0 255.0 221.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 32.0 251.0 251.0 251.0 253.0 220.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 32.0 251.0 251.0 251.0 253.0 220.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 32.0 251.0 251.0 251.0 253.0 220.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 32.0 251.0 251.0 251.0 253.0 220.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 20.0 206.0 253.0 253.0 255.0 253.0 126.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 32.0 229.0 251.0 253.0 251.0 126.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 221.0 251.0 253.0 251.0 188.0 95.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 181.0 211.0 253.0 251.0 251.0 188.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 24.0 35.0 153.0 251.0 251.0 89.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 37.0 253.0 255.0 253.0 72.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 63.0 63.0 0.0 0.0 63.0 181.0 252.0 253.0 252.0 71.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 182.0 242.0 215.0 0.0 16.0 222.0 252.0 252.0 237.0 174.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 144.0 253.0 210.0 92.0 1.0 191.0 252.0 252.0 252.0 144.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 94.0 211.0 252.0 206.0 20.0 0.0 144.0 253.0 252.0 252.0 108.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 32.0 227.0 252.0 252.0 20.0 0.0 32.0 237.0 253.0 252.0 220.0 15.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 37.0 211.0 252.0 246.0 132.0 0.0 11.0 150.0 252.0 253.0 252.0 195.0 0.0 0.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 37.0 252.0 252.0 252.0 132.0 0.0 0.0 73.0 252.0 252.0 253.0 252.0 71.0 0.0 145.0 206.0 41.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 182.0 253.0 253.0 253.0 72.0 0.0 0.0 73.0 253.0 253.0 255.0 211.0 109.0 191.0 255.0 253.0 72.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 63.0 242.0 252.0 252.0 252.0 124.0 73.0 42.0 115.0 252.0 252.0 253.0 252.0 252.0 252.0 253.0 231.0 51.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 73.0 252.0 252.0 252.0 252.0 252.0 252.0 222.0 242.0 252.0 252.0 253.0 252.0 252.0 252.0 237.0 153.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 73.0 252.0 252.0 252.0 252.0 252.0 252.0 253.0 252.0 252.0 252.0 253.0 252.0 252.0 252.0 144.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 42.0 160.0 253.0 253.0 253.0 253.0 253.0 255.0 253.0 253.0 253.0 255.0 253.0 237.0 144.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 119.0 210.0 189.0 231.0 252.0 253.0 252.0 252.0 252.0 222.0 138.0 30.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 31.0 10.0 51.0 154.0 253.0 252.0 252.0 252.0 160.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 253.0 252.0 252.0 252.0 253.0 119.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 192.0 253.0 253.0 253.0 255.0 253.0 133.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 78.0 242.0 252.0 252.0 253.0 252.0 174.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 103.0 221.0 252.0 253.0 220.0 61.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 16.0 190.0 108.0 15.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 22.0 245.0 86.0 5.0 11.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 80.0 240.0 177.0 203.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 184.0 252.0 252.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 184.0 252.0 252.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 131.0 252.0 252.0 106.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 32.0 229.0 253.0 244.0 50.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 133.0 252.0 253.0 113.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 68.0 215.0 253.0 219.0 19.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 253.0 252.0 111.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 253.0 252.0 183.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 253.0 184.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 159.0 252.0 196.0 9.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 17.0 227.0 252.0 45.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 161.0 252.0 45.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 57.0 252.0 150.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 47.0 253.0 161.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 47.0 252.0 160.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 47.0 252.0 160.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 47.0 252.0 236.0 19.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 137.0 116.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 27.0 136.0 57.0 18.0 18.0 18.0 18.0 18.0 38.0 136.0 45.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 41.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 41.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 73.0 182.0 157.0 65.0 161.0 212.0 253.0 253.0 253.0 253.0 232.0 30.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 57.0 248.0 253.0 253.0 233.0 60.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 12.0 244.0 253.0 253.0 247.0 52.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 187.0 253.0 253.0 194.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 24.0 113.0 142.0 142.0 249.0 253.0 253.0 93.0 24.0 24.0 24.0 24.0 24.0 24.0 24.0 24.0 24.0 13.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 30.0 240.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 237.0 168.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 52.0 110.0 215.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 215.0 194.0 155.0 46.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 89.0 253.0 253.0 253.0 241.0 230.0 194.0 176.0 69.0 59.0 59.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 89.0 253.0 253.0 253.0 167.0 29.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 89.0 253.0 253.0 253.0 94.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 89.0 253.0 253.0 230.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 89.0 253.0 253.0 243.0 55.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 89.0 253.0 253.0 253.0 94.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 89.0 253.0 253.0 253.0 94.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 89.0 253.0 253.0 234.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 89.0 253.0 253.0 230.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 122.0 135.0 68.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 157.0 241.0 247.0 130.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 87.0 241.0 241.0 198.0 222.0 253.0 152.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 19.0 168.0 253.0 243.0 41.0 0.0 16.0 178.0 254.0 109.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 146.0 253.0 207.0 39.0 0.0 0.0 0.0 52.0 235.0 120.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 72.0 243.0 240.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 209.0 243.0 71.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 20.0 209.0 253.0 145.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 136.0 254.0 225.0 18.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 238.0 254.0 89.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 109.0 253.0 202.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 135.0 254.0 182.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 116.0 253.0 129.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 154.0 253.0 91.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 27.0 238.0 253.0 129.0 0.0 0.0 0.0 0.0 12.0 19.0 19.0 19.0 12.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 27.0 238.0 253.0 181.0 0.0 0.0 40.0 124.0 228.0 253.0 253.0 253.0 227.0 66.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 141.0 254.0 202.0 5.0 153.0 254.0 254.0 255.0 186.0 191.0 254.0 254.0 202.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 90.0 253.0 254.0 237.0 250.0 223.0 108.0 18.0 2.0 3.0 203.0 253.0 254.0 18.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 145.0 254.0 253.0 253.0 125.0 0.0 0.0 8.0 50.0 226.0 253.0 146.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 20.0 208.0 253.0 253.0 249.0 199.0 200.0 211.0 253.0 251.0 169.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 124.0 175.0 253.0 253.0 254.0 253.0 207.0 86.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 38.0 122.0 246.0 255.0 255.0 245.0 121.0 8.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 57.0 176.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 155.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 191.0 253.0 253.0 253.0 253.0 250.0 248.0 253.0 253.0 253.0 105.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 126.0 253.0 253.0 245.0 210.0 111.0 37.0 0.0 155.0 253.0 253.0 187.0 14.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 253.0 253.0 250.0 139.0 0.0 0.0 0.0 0.0 15.0 226.0 253.0 253.0 116.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 253.0 253.0 141.0 0.0 0.0 0.0 0.0 0.0 0.0 76.0 253.0 253.0 219.0 25.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 73.0 253.0 238.0 22.0 0.0 0.0 0.0 0.0 0.0 14.0 221.0 253.0 253.0 253.0 150.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 114.0 253.0 235.0 21.0 0.0 0.0 0.0 0.0 32.0 193.0 253.0 253.0 253.0 253.0 230.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 61.0 253.0 253.0 126.0 0.0 0.0 2.0 40.0 171.0 253.0 253.0 253.0 253.0 253.0 159.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 253.0 253.0 211.0 96.0 55.0 159.0 253.0 253.0 253.0 253.0 253.0 253.0 240.0 73.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 133.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 214.0 253.0 253.0 188.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 97.0 174.0 245.0 253.0 252.0 232.0 192.0 22.0 65.0 253.0 253.0 87.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 54.0 86.0 81.0 0.0 0.0 0.0 21.0 222.0 235.0 28.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 23.0 224.0 226.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 72.0 253.0 123.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 168.0 253.0 192.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 168.0 253.0 237.0 33.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 168.0 253.0 253.0 81.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 168.0 253.0 253.0 81.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 97.0 233.0 242.0 46.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
diff --git a/pymic/test/runs/Feb19_16-56-35_uestc-MW50-SV0/00001/noMetadata/tensors.tsv b/pymic/test/runs/Feb19_16-56-35_uestc-MW50-SV0/00001/noMetadata/tensors.tsv
deleted file mode 100644
index f0c6e15..0000000
--- a/pymic/test/runs/Feb19_16-56-35_uestc-MW50-SV0/00001/noMetadata/tensors.tsv
+++ /dev/null
@@ -1,100 +0,0 @@
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 84.0 185.0 159.0 151.0 60.0 36.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 222.0 254.0 254.0 254.0 254.0 241.0 198.0 198.0 198.0 198.0 198.0 198.0 198.0 198.0 170.0 52.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 67.0 114.0 72.0 114.0 163.0 227.0 254.0 225.0 254.0 254.0 254.0 250.0 229.0 254.0 254.0 140.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 17.0 66.0 14.0 67.0 67.0 67.0 59.0 21.0 236.0 254.0 106.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 83.0 253.0 209.0 18.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 22.0 233.0 255.0 83.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 129.0 254.0 238.0 44.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 59.0 249.0 254.0 62.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 133.0 254.0 187.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 9.0 205.0 248.0 58.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 126.0 254.0 182.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 75.0 251.0 240.0 57.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 19.0 221.0 254.0 166.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 203.0 254.0 219.0 35.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 38.0 254.0 254.0 77.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 31.0 224.0 254.0 115.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 133.0 254.0 254.0 52.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 61.0 242.0 254.0 254.0 52.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 121.0 254.0 254.0 219.0 40.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 121.0 254.0 207.0 18.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 116.0 125.0 171.0 255.0 255.0 150.0 93.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 169.0 253.0 253.0 253.0 253.0 253.0 253.0 218.0 30.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 169.0 253.0 253.0 253.0 213.0 142.0 176.0 253.0 253.0 122.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 52.0 250.0 253.0 210.0 32.0 12.0 0.0 6.0 206.0 253.0 140.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 77.0 251.0 210.0 25.0 0.0 0.0 0.0 122.0 248.0 253.0 65.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 31.0 18.0 0.0 0.0 0.0 0.0 209.0 253.0 253.0 65.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 117.0 247.0 253.0 198.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 76.0 247.0 253.0 231.0 63.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 253.0 253.0 144.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 176.0 246.0 253.0 159.0 12.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 25.0 234.0 253.0 233.0 35.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 198.0 253.0 253.0 141.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 78.0 248.0 253.0 189.0 12.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 19.0 200.0 253.0 253.0 141.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 134.0 253.0 253.0 173.0 12.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 248.0 253.0 253.0 25.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 248.0 253.0 253.0 43.0 20.0 20.0 20.0 20.0 5.0 0.0 5.0 20.0 20.0 37.0 150.0 150.0 150.0 147.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 248.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 168.0 143.0 166.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 123.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 174.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 249.0 247.0 247.0 169.0 117.0 117.0 57.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 118.0 123.0 123.0 123.0 166.0 253.0 253.0 253.0 155.0 123.0 123.0 41.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 38.0 254.0 109.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 87.0 252.0 82.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 135.0 241.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 45.0 244.0 150.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 84.0 254.0 63.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 202.0 223.0 11.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 32.0 254.0 216.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 95.0 254.0 195.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 140.0 254.0 77.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 57.0 237.0 205.0 8.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 124.0 255.0 165.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 171.0 254.0 81.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 24.0 232.0 215.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 120.0 254.0 159.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 151.0 254.0 142.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 228.0 254.0 66.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 61.0 251.0 254.0 66.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 141.0 254.0 205.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 10.0 215.0 254.0 121.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 198.0 176.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 150.0 253.0 202.0 31.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 37.0 251.0 251.0 253.0 107.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 197.0 251.0 251.0 253.0 107.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 110.0 190.0 251.0 251.0 251.0 253.0 169.0 109.0 62.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 253.0 251.0 251.0 251.0 251.0 253.0 251.0 251.0 220.0 51.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 182.0 255.0 253.0 253.0 253.0 253.0 234.0 222.0 253.0 253.0 253.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 63.0 221.0 253.0 251.0 251.0 251.0 147.0 77.0 62.0 128.0 251.0 251.0 105.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 32.0 231.0 251.0 253.0 251.0 220.0 137.0 10.0 0.0 0.0 31.0 230.0 251.0 243.0 113.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 37.0 251.0 251.0 253.0 188.0 20.0 0.0 0.0 0.0 0.0 0.0 109.0 251.0 253.0 251.0 35.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 37.0 251.0 251.0 201.0 30.0 0.0 0.0 0.0 0.0 0.0 0.0 31.0 200.0 253.0 251.0 35.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 37.0 253.0 253.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 32.0 202.0 255.0 253.0 164.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 140.0 251.0 251.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 109.0 251.0 253.0 251.0 35.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 217.0 251.0 251.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 63.0 231.0 251.0 253.0 230.0 30.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 217.0 251.0 251.0 0.0 0.0 0.0 0.0 0.0 0.0 144.0 251.0 251.0 251.0 221.0 61.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 217.0 251.0 251.0 0.0 0.0 0.0 0.0 0.0 182.0 221.0 251.0 251.0 251.0 180.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 218.0 253.0 253.0 73.0 73.0 228.0 253.0 253.0 255.0 253.0 253.0 253.0 253.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 113.0 251.0 251.0 253.0 251.0 251.0 251.0 251.0 253.0 251.0 251.0 251.0 147.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 31.0 230.0 251.0 253.0 251.0 251.0 251.0 251.0 253.0 230.0 189.0 35.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 62.0 142.0 253.0 251.0 251.0 251.0 251.0 253.0 107.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 72.0 174.0 251.0 173.0 71.0 72.0 30.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 50.0 224.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 70.0 29.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 121.0 231.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 148.0 168.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 195.0 231.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 96.0 210.0 11.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 69.0 252.0 134.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 114.0 252.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 45.0 236.0 217.0 12.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 192.0 252.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 168.0 247.0 53.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 18.0 255.0 253.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 84.0 242.0 211.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 141.0 253.0 189.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 169.0 252.0 106.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 32.0 232.0 250.0 66.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 15.0 225.0 252.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 134.0 252.0 211.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 22.0 252.0 164.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 169.0 252.0 167.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 9.0 204.0 209.0 18.0 0.0 0.0 0.0 0.0 0.0 0.0 22.0 253.0 253.0 107.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 169.0 252.0 199.0 85.0 85.0 85.0 85.0 129.0 164.0 195.0 252.0 252.0 106.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 41.0 170.0 245.0 252.0 252.0 252.0 252.0 232.0 231.0 251.0 252.0 252.0 9.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 49.0 84.0 84.0 84.0 84.0 0.0 0.0 161.0 252.0 252.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 127.0 252.0 252.0 45.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 253.0 253.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 127.0 252.0 252.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 135.0 252.0 244.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 232.0 236.0 111.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 179.0 66.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 77.0 254.0 107.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 19.0 227.0 254.0 254.0 9.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 81.0 254.0 254.0 165.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 7.0 203.0 254.0 254.0 73.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 53.0 254.0 254.0 250.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 134.0 254.0 254.0 180.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 196.0 254.0 248.0 48.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 58.0 254.0 254.0 237.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 111.0 254.0 254.0 132.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 163.0 254.0 238.0 28.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 60.0 252.0 254.0 223.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 79.0 254.0 254.0 154.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 163.0 254.0 238.0 53.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 28.0 252.0 254.0 210.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 86.0 254.0 254.0 131.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 105.0 254.0 234.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 175.0 254.0 204.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 211.0 254.0 196.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 158.0 254.0 160.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 26.0 157.0 107.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 22.0 192.0 134.0 32.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 15.0 77.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 17.0 235.0 250.0 169.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 15.0 220.0 241.0 37.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 20.0 189.0 253.0 147.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 139.0 253.0 100.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 70.0 253.0 253.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 43.0 254.0 173.0 13.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 22.0 153.0 253.0 96.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 43.0 231.0 254.0 92.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 163.0 255.0 204.0 11.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 104.0 254.0 158.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 162.0 253.0 178.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 9.0 131.0 237.0 253.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 162.0 253.0 253.0 191.0 175.0 70.0 70.0 70.0 70.0 133.0 197.0 253.0 253.0 169.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 51.0 228.0 253.0 253.0 254.0 253.0 253.0 253.0 253.0 254.0 253.0 253.0 219.0 35.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 17.0 65.0 137.0 254.0 232.0 137.0 137.0 137.0 44.0 253.0 253.0 161.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 34.0 254.0 206.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 160.0 253.0 69.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 85.0 254.0 241.0 50.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 158.0 254.0 165.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 231.0 244.0 50.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 104.0 254.0 232.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 208.0 253.0 157.0 0.0 13.0 30.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 208.0 253.0 154.0 91.0 204.0 161.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 208.0 253.0 254.0 253.0 154.0 29.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 61.0 190.0 128.0 23.0 6.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 14.0 149.0 193.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 91.0 224.0 253.0 253.0 19.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 28.0 235.0 254.0 253.0 253.0 166.0 18.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 144.0 253.0 254.0 253.0 253.0 253.0 238.0 115.0 6.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 31.0 241.0 253.0 208.0 185.0 253.0 253.0 253.0 231.0 24.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 79.0 254.0 193.0 0.0 8.0 98.0 219.0 254.0 255.0 201.0 18.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 86.0 253.0 80.0 0.0 0.0 0.0 182.0 253.0 254.0 191.0 12.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 175.0 253.0 155.0 0.0 0.0 0.0 234.0 253.0 254.0 135.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 86.0 253.0 208.0 40.0 85.0 166.0 251.0 237.0 254.0 236.0 42.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 18.0 238.0 253.0 254.0 253.0 253.0 185.0 36.0 216.0 253.0 152.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 68.0 240.0 255.0 254.0 145.0 8.0 0.0 134.0 254.0 223.0 35.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 68.0 158.0 142.0 12.0 0.0 0.0 9.0 175.0 253.0 161.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 88.0 253.0 226.0 18.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 166.0 253.0 126.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 48.0 245.0 253.0 38.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 115.0 254.0 172.0 9.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 218.0 254.0 46.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 30.0 254.0 165.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 186.0 244.0 42.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 14.0 223.0 78.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 17.0 47.0 47.0 47.0 16.0 129.0 85.0 47.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 75.0 153.0 217.0 253.0 253.0 253.0 215.0 246.0 253.0 253.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 35.0 142.0 244.0 252.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 63.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 213.0 170.0 170.0 170.0 170.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 20.0 132.0 72.0 0.0 57.0 238.0 227.0 238.0 168.0 124.0 69.0 20.0 11.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 206.0 253.0 78.0 0.0 0.0 32.0 0.0 30.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 177.0 253.0 132.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 12.0 133.0 253.0 233.0 15.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 92.0 253.0 223.0 28.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 150.0 253.0 174.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 234.0 253.0 246.0 127.0 49.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 253.0 253.0 253.0 251.0 147.0 91.0 121.0 85.0 42.0 42.0 85.0 28.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 139.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 232.0 168.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 53.0 218.0 222.0 251.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 252.0 124.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 67.0 72.0 200.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 175.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 120.0 253.0 249.0 152.0 51.0 164.0 253.0 253.0 175.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 50.0 253.0 253.0 253.0 188.0 252.0 253.0 253.0 148.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 9.0 167.0 253.0 253.0 253.0 253.0 250.0 175.0 11.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 23.0 180.0 231.0 253.0 221.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 93.0 149.0 22.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 36.0 56.0 137.0 201.0 199.0 95.0 37.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 45.0 152.0 234.0 254.0 254.0 254.0 254.0 254.0 250.0 211.0 151.0 6.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 46.0 153.0 240.0 254.0 254.0 227.0 166.0 133.0 251.0 200.0 254.0 229.0 225.0 104.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 153.0 234.0 254.0 254.0 187.0 142.0 8.0 0.0 0.0 191.0 40.0 198.0 246.0 223.0 253.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 8.0 126.0 253.0 254.0 233.0 128.0 11.0 0.0 0.0 0.0 0.0 210.0 43.0 70.0 254.0 254.0 254.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 72.0 243.0 254.0 228.0 54.0 0.0 0.0 0.0 0.0 3.0 32.0 116.0 225.0 242.0 254.0 255.0 162.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 75.0 240.0 254.0 223.0 109.0 138.0 178.0 178.0 169.0 210.0 251.0 231.0 254.0 254.0 254.0 232.0 38.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 9.0 175.0 244.0 253.0 255.0 254.0 254.0 251.0 254.0 254.0 254.0 254.0 254.0 252.0 171.0 25.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 16.0 136.0 195.0 176.0 146.0 153.0 200.0 254.0 254.0 254.0 254.0 150.0 16.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 162.0 254.0 254.0 241.0 99.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 118.0 250.0 254.0 254.0 90.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 100.0 242.0 254.0 254.0 211.0 7.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 54.0 241.0 254.0 254.0 242.0 59.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 131.0 254.0 254.0 244.0 64.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 13.0 249.0 254.0 254.0 152.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 12.0 228.0 254.0 254.0 208.0 8.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 78.0 255.0 254.0 254.0 66.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 209.0 254.0 254.0 137.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 227.0 255.0 233.0 25.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 113.0 255.0 108.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 61.0 3.0 42.0 118.0 193.0 118.0 118.0 61.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 14.0 179.0 245.0 236.0 242.0 254.0 254.0 254.0 254.0 245.0 235.0 84.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 151.0 254.0 254.0 254.0 213.0 192.0 178.0 178.0 180.0 254.0 254.0 241.0 46.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 43.0 235.0 254.0 226.0 64.0 28.0 12.0 0.0 0.0 2.0 128.0 252.0 255.0 173.0 17.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 56.0 254.0 253.0 107.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 134.0 250.0 254.0 75.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 63.0 254.0 158.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 221.0 254.0 157.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 194.0 254.0 103.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 150.0 254.0 213.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 34.0 220.0 239.0 58.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 84.0 254.0 213.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 126.0 254.0 171.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 84.0 254.0 213.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 214.0 239.0 60.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 84.0 254.0 213.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 214.0 199.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 84.0 254.0 213.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 219.0 199.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 84.0 254.0 213.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 98.0 254.0 199.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 162.0 254.0 209.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 98.0 254.0 199.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 51.0 238.0 254.0 75.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 98.0 254.0 199.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 51.0 165.0 254.0 195.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 66.0 241.0 199.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 167.0 254.0 227.0 55.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 214.0 213.0 20.0 0.0 0.0 0.0 0.0 0.0 46.0 152.0 202.0 254.0 254.0 63.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 214.0 254.0 204.0 180.0 180.0 180.0 180.0 180.0 235.0 254.0 254.0 234.0 156.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 81.0 205.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 252.0 234.0 120.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 26.0 210.0 254.0 254.0 254.0 254.0 254.0 153.0 104.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 7.0 204.0 253.0 176.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 7.0 150.0 252.0 252.0 125.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 117.0 252.0 186.0 56.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 141.0 252.0 118.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 154.0 247.0 50.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 26.0 253.0 196.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 150.0 253.0 196.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 57.0 85.0 85.0 38.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 225.0 253.0 96.0 0.0 0.0 0.0 0.0 0.0 151.0 226.0 243.0 252.0 252.0 238.0 125.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 10.0 229.0 226.0 0.0 0.0 0.0 4.0 54.0 229.0 253.0 255.0 234.0 175.0 225.0 255.0 228.0 31.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 110.0 252.0 150.0 0.0 0.0 26.0 128.0 252.0 252.0 227.0 134.0 28.0 0.0 0.0 178.0 252.0 56.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 159.0 252.0 113.0 0.0 0.0 150.0 253.0 252.0 186.0 43.0 0.0 0.0 0.0 0.0 141.0 252.0 56.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 185.0 252.0 113.0 0.0 38.0 237.0 253.0 151.0 6.0 0.0 0.0 0.0 0.0 0.0 141.0 202.0 6.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 198.0 253.0 114.0 0.0 147.0 253.0 163.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 154.0 197.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 197.0 252.0 113.0 0.0 172.0 252.0 188.0 0.0 0.0 0.0 0.0 0.0 0.0 26.0 253.0 171.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 197.0 252.0 113.0 0.0 19.0 231.0 247.0 122.0 19.0 0.0 0.0 0.0 0.0 200.0 244.0 56.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 26.0 222.0 252.0 113.0 0.0 0.0 25.0 203.0 252.0 193.0 13.0 0.0 76.0 200.0 249.0 125.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 185.0 253.0 179.0 10.0 0.0 0.0 0.0 76.0 35.0 29.0 154.0 253.0 244.0 125.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 28.0 209.0 253.0 196.0 82.0 57.0 57.0 131.0 197.0 252.0 253.0 214.0 81.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 25.0 216.0 252.0 252.0 252.0 253.0 252.0 252.0 252.0 156.0 19.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 16.0 103.0 139.0 240.0 140.0 139.0 139.0 40.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 49.0 180.0 253.0 255.0 253.0 169.0 36.0 11.0 76.0 9.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 68.0 228.0 252.0 252.0 253.0 252.0 252.0 160.0 189.0 253.0 92.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 55.0 252.0 252.0 227.0 79.0 69.0 69.0 100.0 90.0 236.0 247.0 67.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 43.0 233.0 252.0 185.0 50.0 0.0 0.0 0.0 26.0 203.0 252.0 135.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 168.0 253.0 178.0 37.0 0.0 0.0 0.0 0.0 70.0 252.0 252.0 63.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 155.0 253.0 242.0 42.0 0.0 0.0 0.0 0.0 5.0 191.0 253.0 190.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 207.0 252.0 230.0 0.0 0.0 0.0 0.0 5.0 136.0 252.0 252.0 64.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 207.0 252.0 230.0 0.0 0.0 0.0 32.0 138.0 252.0 252.0 227.0 16.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 165.0 252.0 249.0 207.0 207.0 207.0 228.0 253.0 252.0 252.0 160.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 9.0 179.0 253.0 252.0 252.0 252.0 252.0 75.0 169.0 252.0 56.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 116.0 116.0 74.0 0.0 149.0 253.0 215.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 253.0 252.0 162.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 32.0 253.0 240.0 50.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 157.0 253.0 164.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 43.0 240.0 253.0 92.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 93.0 253.0 252.0 84.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 114.0 252.0 209.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 207.0 252.0 116.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 165.0 252.0 116.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 93.0 200.0 63.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 17.0 66.0 138.0 255.0 253.0 169.0 138.0 23.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 120.0 228.0 252.0 252.0 253.0 252.0 252.0 252.0 158.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 108.0 252.0 252.0 252.0 252.0 190.0 252.0 252.0 252.0 252.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 43.0 233.0 252.0 252.0 252.0 116.0 5.0 135.0 252.0 252.0 252.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 43.0 178.0 253.0 252.0 221.0 43.0 2.0 0.0 5.0 54.0 232.0 252.0 210.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 93.0 253.0 255.0 249.0 115.0 0.0 0.0 0.0 0.0 0.0 136.0 251.0 255.0 154.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 166.0 252.0 253.0 185.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 209.0 253.0 206.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 19.0 220.0 252.0 253.0 92.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 116.0 253.0 206.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 70.0 252.0 252.0 192.0 17.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 116.0 253.0 223.0 25.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 122.0 252.0 252.0 63.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 116.0 253.0 252.0 69.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 132.0 253.0 253.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 116.0 255.0 253.0 69.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 184.0 252.0 252.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 116.0 253.0 252.0 69.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 184.0 252.0 252.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 116.0 253.0 240.0 50.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 184.0 252.0 252.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 210.0 253.0 112.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 48.0 232.0 252.0 158.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 230.0 232.0 8.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 93.0 253.0 244.0 50.0 0.0 0.0 0.0 0.0 0.0 0.0 155.0 253.0 168.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 34.0 164.0 253.0 113.0 0.0 0.0 0.0 0.0 0.0 66.0 236.0 231.0 42.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 32.0 222.0 240.0 134.0 0.0 0.0 38.0 91.0 234.0 252.0 137.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 25.0 177.0 240.0 207.0 103.0 233.0 252.0 252.0 176.0 35.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 15.0 54.0 179.0 252.0 137.0 137.0 54.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 255.0 191.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 191.0 255.0 255.0 64.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 255.0 255.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 255.0 255.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 255.0 255.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 255.0 255.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 255.0 255.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 255.0 255.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 255.0 255.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 255.0 255.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 255.0 255.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 255.0 255.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 255.0 255.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 255.0 255.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 191.0 255.0 255.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 191.0 255.0 255.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 255.0 255.0 255.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 191.0 255.0 255.0 255.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 255.0 255.0 255.0 64.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 255.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 51.0 132.0 214.0 253.0 254.0 253.0 203.0 162.0 41.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 102.0 142.0 203.0 203.0 253.0 252.0 253.0 252.0 151.0 70.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 253.0 244.0 203.0 142.0 102.0 82.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 172.0 252.0 203.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 223.0 234.0 30.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 122.0 253.0 50.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 123.0 254.0 91.0 51.0 51.0 51.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 223.0 253.0 252.0 253.0 252.0 253.0 172.0 82.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 214.0 253.0 203.0 162.0 102.0 102.0 203.0 223.0 254.0 253.0 51.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 61.0 253.0 171.0 0.0 0.0 0.0 0.0 0.0 20.0 112.0 192.0 253.0 212.0 41.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 102.0 203.0 234.0 51.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 20.0 213.0 232.0 82.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 62.0 203.0 234.0 112.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 20.0 213.0 252.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 153.0 253.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 41.0 233.0 212.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 113.0 92.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 31.0 173.0 244.0 40.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 82.0 253.0 151.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 102.0 102.0 183.0 233.0 212.0 81.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 82.0 255.0 253.0 234.0 152.0 153.0 193.0 173.0 253.0 254.0 253.0 254.0 213.0 142.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 71.0 151.0 151.0 232.0 253.0 212.0 192.0 151.0 131.0 50.0 50.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 146.0 229.0 255.0 205.0 120.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 24.0 198.0 252.0 253.0 225.0 216.0 235.0 252.0 89.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 20.0 205.0 253.0 223.0 70.0 15.0 0.0 29.0 206.0 174.0 2.0 87.0 38.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 137.0 253.0 227.0 6.0 0.0 0.0 0.0 0.0 35.0 28.0 76.0 253.0 253.0 9.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 88.0 251.0 235.0 12.0 0.0 0.0 0.0 0.0 0.0 0.0 42.0 238.0 253.0 174.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 134.0 253.0 192.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 14.0 238.0 253.0 161.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 169.0 253.0 74.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 85.0 247.0 253.0 75.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 10.0 250.0 253.0 47.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 219.0 253.0 241.0 31.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 10.0 253.0 253.0 47.0 0.0 0.0 0.0 0.0 0.0 5.0 72.0 253.0 253.0 143.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 221.0 253.0 117.0 0.0 0.0 0.0 0.0 25.0 118.0 253.0 253.0 253.0 47.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 28.0 242.0 254.0 187.0 104.0 146.0 159.0 220.0 244.0 239.0 254.0 224.0 18.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 78.0 201.0 253.0 253.0 248.0 215.0 156.0 67.0 247.0 253.0 157.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 56.0 56.0 50.0 0.0 0.0 38.0 253.0 253.0 74.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 66.0 253.0 253.0 18.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 149.0 253.0 253.0 18.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 30.0 238.0 253.0 191.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 66.0 253.0 253.0 112.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 87.0 253.0 244.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 170.0 253.0 198.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 253.0 149.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 74.0 249.0 254.0 254.0 254.0 245.0 167.0 167.0 136.0 25.0 80.0 60.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 104.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 249.0 254.0 252.0 197.0 113.0 71.0 39.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 99.0 135.0 105.0 105.0 114.0 192.0 192.0 192.0 233.0 254.0 254.0 254.0 254.0 254.0 246.0 129.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 45.0 114.0 114.0 203.0 254.0 254.0 254.0 240.0 15.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 8.0 35.0 155.0 254.0 254.0 130.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 36.0 254.0 241.0 34.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 115.0 254.0 254.0 118.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 34.0 243.0 254.0 240.0 17.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 111.0 254.0 254.0 139.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 37.0 243.0 254.0 244.0 40.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 20.0 176.0 254.0 254.0 113.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 140.0 254.0 254.0 220.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 88.0 253.0 254.0 243.0 45.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 63.0 241.0 254.0 254.0 83.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 16.0 243.0 254.0 254.0 147.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 111.0 254.0 254.0 203.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 58.0 254.0 254.0 254.0 84.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 14.0 237.0 254.0 255.0 194.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 82.0 254.0 254.0 194.0 27.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 39.0 230.0 193.0 28.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 12.0 41.0 146.0 146.0 48.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 12.0 129.0 253.0 253.0 253.0 250.0 163.0 18.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 133.0 253.0 253.0 253.0 253.0 253.0 253.0 229.0 70.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 101.0 253.0 252.0 145.0 102.0 107.0 237.0 253.0 247.0 128.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 181.0 253.0 167.0 0.0 0.0 0.0 61.0 235.0 253.0 253.0 163.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 253.0 43.0 0.0 0.0 0.0 0.0 58.0 193.0 253.0 253.0 164.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 187.0 253.0 32.0 0.0 0.0 0.0 0.0 0.0 55.0 236.0 253.0 253.0 86.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 146.0 253.0 32.0 0.0 100.0 190.0 87.0 87.0 87.0 147.0 253.0 253.0 123.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 94.0 253.0 78.0 40.0 248.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 223.0 84.0 15.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 14.0 92.0 12.0 35.0 240.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 244.0 89.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 75.0 161.0 179.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 209.0 43.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 16.0 16.0 39.0 38.0 16.0 16.0 145.0 243.0 253.0 253.0 185.0 48.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 20.0 58.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 58.0 209.0 253.0 253.0 183.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 77.0 221.0 247.0 79.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 13.0 219.0 253.0 240.0 72.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 90.0 247.0 253.0 252.0 57.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 53.0 251.0 253.0 191.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 116.0 253.0 253.0 59.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 99.0 252.0 253.0 145.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 14.0 188.0 253.0 221.0 158.0 38.0 0.0 0.0 0.0 0.0 111.0 211.0 246.0 253.0 253.0 145.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 12.0 221.0 246.0 253.0 251.0 249.0 249.0 249.0 249.0 253.0 253.0 253.0 253.0 200.0 19.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 95.0 183.0 228.0 253.0 253.0 253.0 253.0 253.0 253.0 195.0 124.0 23.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 24.0 37.0 138.0 74.0 126.0 88.0 37.0 7.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 168.0 91.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 234.0 126.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 51.0 254.0 126.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 38.0 178.0 31.0 0.0 0.0 0.0 0.0 0.0 51.0 254.0 81.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 94.0 254.0 83.0 0.0 0.0 0.0 0.0 0.0 87.0 254.0 54.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 160.0 254.0 56.0 0.0 0.0 0.0 0.0 0.0 189.0 238.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 13.0 227.0 168.0 2.0 0.0 0.0 0.0 0.0 0.0 194.0 236.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 55.0 254.0 114.0 0.0 0.0 0.0 0.0 0.0 16.0 235.0 167.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 115.0 254.0 50.0 0.0 0.0 0.0 0.0 0.0 103.0 254.0 105.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 7.0 221.0 236.0 75.0 156.0 180.0 190.0 252.0 252.0 253.0 254.0 114.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 15.0 254.0 254.0 254.0 252.0 211.0 179.0 179.0 179.0 246.0 254.0 247.0 94.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 8.0 217.0 239.0 117.0 22.0 0.0 0.0 0.0 0.0 226.0 254.0 242.0 197.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 14.0 18.0 0.0 0.0 0.0 0.0 0.0 27.0 243.0 207.0 46.0 37.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 99.0 254.0 132.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 116.0 254.0 67.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 116.0 254.0 61.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 116.0 254.0 61.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 174.0 255.0 100.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 187.0 254.0 83.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 115.0 176.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 31.0 140.0 193.0 44.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 38.0 146.0 240.0 254.0 254.0 228.0 48.0 77.0 46.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 43.0 230.0 254.0 254.0 254.0 254.0 254.0 241.0 254.0 197.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 130.0 254.0 254.0 254.0 239.0 252.0 254.0 254.0 254.0 254.0 237.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 154.0 254.0 254.0 249.0 104.0 71.0 198.0 254.0 254.0 254.0 234.0 57.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 173.0 252.0 252.0 206.0 51.0 120.0 215.0 254.0 254.0 254.0 254.0 184.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 112.0 254.0 254.0 215.0 87.0 247.0 254.0 254.0 254.0 254.0 254.0 217.0 31.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 231.0 254.0 254.0 254.0 254.0 254.0 236.0 128.0 196.0 254.0 254.0 119.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 197.0 254.0 254.0 245.0 238.0 131.0 17.0 46.0 247.0 254.0 199.0 14.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 16.0 92.0 88.0 40.0 0.0 0.0 12.0 173.0 254.0 242.0 38.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 95.0 254.0 254.0 155.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 18.0 210.0 254.0 225.0 6.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 197.0 254.0 254.0 99.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 34.0 242.0 254.0 179.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 27.0 223.0 254.0 225.0 30.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 77.0 254.0 255.0 127.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 54.0 238.0 254.0 248.0 53.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 183.0 254.0 254.0 231.0 41.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 113.0 254.0 254.0 230.0 48.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 110.0 239.0 126.0 25.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 49.0 180.0 253.0 244.0 50.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 184.0 252.0 252.0 232.0 164.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 66.0 234.0 252.0 136.0 38.0 56.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 19.0 236.0 252.0 176.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 76.0 252.0 252.0 56.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 139.0 253.0 173.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 22.0 212.0 252.0 69.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 116.0 253.0 240.0 50.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 157.0 253.0 206.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 230.0 253.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 231.0 255.0 180.0 138.0 180.0 253.0 255.0 253.0 222.0 97.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 230.0 253.0 252.0 252.0 252.0 252.0 211.0 252.0 252.0 252.0 117.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 230.0 253.0 240.0 183.0 89.0 69.0 7.0 69.0 171.0 252.0 252.0 85.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 135.0 253.0 153.0 0.0 0.0 0.0 0.0 0.0 13.0 215.0 252.0 116.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 116.0 253.0 206.0 0.0 0.0 0.0 0.0 0.0 0.0 155.0 252.0 116.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 106.0 255.0 211.0 7.0 0.0 0.0 0.0 0.0 49.0 233.0 253.0 116.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 159.0 252.0 154.0 9.0 0.0 0.0 30.0 197.0 252.0 252.0 95.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 17.0 227.0 252.0 154.0 70.0 81.0 228.0 252.0 227.0 130.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 50.0 227.0 252.0 252.0 253.0 252.0 185.0 50.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 48.0 179.0 252.0 190.0 117.0 6.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 114.0 255.0 57.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 226.0 255.0 57.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 29.0 255.0 114.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 114.0 255.0 86.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 198.0 255.0 29.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 29.0 255.0 226.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 141.0 255.0 141.0 0.0 0.0 0.0 0.0 0.0 0.0 57.0 86.0 86.0 141.0 57.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 170.0 255.0 86.0 0.0 0.0 0.0 0.0 0.0 57.0 226.0 255.0 255.0 255.0 255.0 57.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 170.0 255.0 86.0 0.0 0.0 0.0 0.0 0.0 170.0 255.0 255.0 114.0 57.0 226.0 198.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 170.0 255.0 86.0 0.0 0.0 0.0 0.0 57.0 255.0 255.0 86.0 0.0 0.0 170.0 255.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 170.0 255.0 86.0 0.0 0.0 0.0 0.0 170.0 255.0 86.0 0.0 0.0 0.0 170.0 255.0 86.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 141.0 255.0 114.0 0.0 0.0 0.0 29.0 255.0 198.0 0.0 0.0 0.0 0.0 170.0 255.0 86.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 29.0 255.0 255.0 0.0 0.0 0.0 170.0 255.0 114.0 0.0 0.0 0.0 0.0 198.0 226.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 198.0 255.0 114.0 0.0 0.0 170.0 255.0 86.0 0.0 0.0 0.0 86.0 255.0 114.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 86.0 255.0 255.0 170.0 57.0 255.0 255.0 29.0 0.0 0.0 86.0 226.0 226.0 29.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 114.0 226.0 255.0 255.0 255.0 255.0 86.0 86.0 170.0 255.0 255.0 57.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 29.0 141.0 255.0 255.0 255.0 255.0 255.0 255.0 198.0 29.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 226.0 255.0 255.0 141.0 86.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 141.0 255.0 255.0 170.0 170.0 57.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 141.0 226.0 170.0 114.0 29.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 69.0 152.0 237.0 254.0 254.0 255.0 254.0 252.0 52.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 87.0 164.0 237.0 253.0 254.0 218.0 138.0 83.0 39.0 154.0 254.0 135.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 138.0 246.0 253.0 254.0 216.0 167.0 54.0 5.0 0.0 0.0 0.0 100.0 191.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 233.0 254.0 169.0 53.0 6.0 0.0 0.0 0.0 0.0 0.0 0.0 35.0 8.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 174.0 254.0 94.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 38.0 245.0 221.0 13.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 142.0 254.0 149.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 151.0 254.0 112.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 226.0 242.0 32.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 12.0 240.0 203.0 44.0 44.0 44.0 44.0 8.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 70.0 254.0 254.0 254.0 254.0 254.0 254.0 205.0 85.0 8.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 37.0 184.0 169.0 133.0 133.0 162.0 212.0 254.0 254.0 166.0 8.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 9.0 51.0 177.0 254.0 125.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 27.0 209.0 254.0 104.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 63.0 209.0 254.0 194.0 13.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 0.0 10.0 137.0 244.0 254.0 198.0 52.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 13.0 87.0 122.0 147.0 223.0 254.0 247.0 127.0 13.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 118.0 250.0 210.0 248.0 254.0 252.0 199.0 49.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 138.0 254.0 254.0 254.0 250.0 201.0 72.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 79.0 167.0 197.0 87.0 7.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 197.0 60.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 50.0 243.0 42.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 186.0 236.0 21.0 0.0 0.0 0.0 134.0 83.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 88.0 213.0 26.0 0.0 0.0 0.0 0.0 129.0 170.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 120.0 0.0 0.0 0.0 0.0 0.0 91.0 209.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 32.0 234.0 112.0 0.0 0.0 0.0 0.0 0.0 91.0 242.0 30.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 116.0 222.0 21.0 0.0 0.0 0.0 0.0 0.0 170.0 244.0 58.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 30.0 240.0 124.0 0.0 0.0 0.0 0.0 0.0 40.0 249.0 138.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 127.0 241.0 18.0 0.0 0.0 0.0 0.0 0.0 15.0 230.0 134.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 16.0 254.0 179.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 165.0 134.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 9.0 191.0 233.0 136.0 101.0 20.0 0.0 0.0 0.0 0.0 113.0 215.0 31.0 31.0 31.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 8.0 89.0 128.0 194.0 218.0 210.0 210.0 211.0 210.0 226.0 254.0 254.0 204.0 120.0 7.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 10.0 15.0 37.0 90.0 90.0 196.0 241.0 34.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 165.0 233.0 16.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 165.0 143.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 91.0 188.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 91.0 233.0 34.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 20.0 254.0 61.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 209.0 219.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 107.0 166.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 80.0 195.0 85.0 80.0 80.0 80.0 14.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 9.0 253.0 253.0 253.0 253.0 253.0 253.0 152.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 62.0 56.0 0.0 9.0 253.0 253.0 253.0 253.0 253.0 253.0 251.0 237.0 57.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 141.0 253.0 241.0 83.0 4.0 161.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 60.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 141.0 248.0 253.0 253.0 147.0 0.0 73.0 209.0 252.0 253.0 253.0 253.0 253.0 253.0 212.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 147.0 253.0 253.0 253.0 253.0 199.0 34.0 0.0 0.0 160.0 253.0 142.0 194.0 253.0 253.0 244.0 77.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 9.0 136.0 250.0 253.0 253.0 253.0 253.0 253.0 69.0 0.0 0.0 15.0 52.0 5.0 27.0 201.0 253.0 253.0 156.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 80.0 253.0 253.0 253.0 253.0 253.0 253.0 209.0 41.0 0.0 0.0 0.0 0.0 0.0 0.0 36.0 253.0 253.0 196.0 33.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 86.0 253.0 253.0 253.0 253.0 253.0 234.0 41.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 42.0 253.0 253.0 253.0 78.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 253.0 253.0 253.0 253.0 253.0 165.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 211.0 253.0 253.0 253.0 78.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 253.0 253.0 253.0 253.0 172.0 18.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 211.0 253.0 253.0 253.0 78.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 253.0 253.0 253.0 210.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 42.0 229.0 246.0 252.0 253.0 253.0 159.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 253.0 253.0 253.0 209.0 0.0 0.0 0.0 0.0 0.0 99.0 149.0 210.0 253.0 253.0 253.0 253.0 242.0 65.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 253.0 253.0 253.0 218.0 53.0 53.0 53.0 180.0 228.0 244.0 253.0 253.0 253.0 253.0 253.0 253.0 77.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 163.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 193.0 29.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 80.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 234.0 193.0 24.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 44.0 210.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 229.0 67.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 38.0 228.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 248.0 235.0 65.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 39.0 210.0 253.0 253.0 253.0 253.0 253.0 253.0 189.0 114.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 43.0 108.0 253.0 253.0 179.0 78.0 78.0 27.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 0.0 0.0 0.0 11.0 92.0 173.0 253.0 254.0 253.0 254.0 253.0 62.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 142.0 0.0 21.0 102.0 213.0 252.0 233.0 151.0 131.0 131.0 253.0 252.0 142.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 163.0 152.0 152.0 214.0 233.0 183.0 102.0 0.0 0.0 0.0 0.0 132.0 253.0 255.0 50.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 82.0 243.0 253.0 252.0 131.0 30.0 0.0 0.0 0.0 0.0 0.0 0.0 10.0 212.0 253.0 131.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 123.0 203.0 102.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 203.0 255.0 151.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 162.0 253.0 151.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 102.0 254.0 151.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 102.0 253.0 151.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 163.0 254.0 91.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 203.0 253.0 50.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 203.0 203.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 223.0 122.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 72.0 253.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 233.0 252.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 233.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 41.0 253.0 151.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 123.0 254.0 50.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 223.0 233.0 30.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 51.0 253.0 183.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 51.0 252.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 221.0 115.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 51.0 254.0 148.0 0.0 0.0 0.0 0.0 22.0 230.0 134.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 168.0 254.0 115.0 0.0 0.0 0.0 0.0 24.0 253.0 184.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 51.0 234.0 254.0 81.0 0.0 0.0 0.0 0.0 91.0 253.0 184.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 13.0 221.0 254.0 160.0 0.0 0.0 0.0 0.0 0.0 141.0 254.0 127.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 114.0 253.0 253.0 76.0 0.0 0.0 0.0 0.0 0.0 207.0 253.0 93.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 15.0 232.0 253.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 207.0 253.0 17.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 229.0 253.0 202.0 19.0 0.0 0.0 0.0 0.0 0.0 34.0 240.0 253.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 7.0 170.0 254.0 254.0 46.0 0.0 0.0 0.0 0.0 0.0 0.0 47.0 254.0 254.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 24.0 253.0 254.0 253.0 234.0 163.0 47.0 47.0 26.0 0.0 0.0 130.0 253.0 253.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 246.0 254.0 253.0 253.0 253.0 254.0 253.0 232.0 174.0 208.0 232.0 253.0 177.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 84.0 161.0 211.0 219.0 219.0 254.0 253.0 253.0 253.0 254.0 253.0 244.0 69.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 93.0 142.0 142.0 93.0 170.0 254.0 230.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 153.0 253.0 213.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 170.0 253.0 137.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 220.0 253.0 137.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 60.0 255.0 254.0 80.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 93.0 254.0 253.0 46.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 51.0 254.0 215.0 9.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 186.0 106.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 32.0 255.0 254.0 255.0 254.0 254.0 254.0 157.0 130.0 88.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 32.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 108.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 14.0 129.0 238.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 30.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 56.0 253.0 248.0 167.0 235.0 253.0 253.0 253.0 253.0 104.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 178.0 253.0 182.0 0.0 27.0 134.0 247.0 253.0 253.0 215.0 15.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 130.0 253.0 222.0 27.0 0.0 0.0 0.0 186.0 253.0 253.0 253.0 24.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 32.0 253.0 253.0 122.0 0.0 0.0 0.0 0.0 67.0 246.0 253.0 253.0 106.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 117.0 253.0 199.0 25.0 0.0 0.0 0.0 0.0 0.0 187.0 253.0 253.0 148.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 46.0 225.0 245.0 67.0 0.0 0.0 0.0 0.0 0.0 0.0 88.0 253.0 253.0 148.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 149.0 253.0 185.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 88.0 253.0 253.0 148.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 15.0 228.0 253.0 93.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 88.0 253.0 253.0 148.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 19.0 253.0 253.0 93.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 88.0 253.0 253.0 148.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 19.0 253.0 253.0 93.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 88.0 253.0 253.0 109.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 19.0 253.0 253.0 134.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 88.0 253.0 219.0 16.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 19.0 253.0 253.0 230.0 32.0 0.0 0.0 0.0 0.0 0.0 0.0 132.0 253.0 154.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 19.0 253.0 253.0 253.0 233.0 120.0 0.0 74.0 100.0 100.0 200.0 248.0 217.0 33.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 159.0 253.0 253.0 253.0 249.0 230.0 247.0 253.0 253.0 253.0 253.0 109.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 95.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 118.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 41.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 119.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 16.0 51.0 88.0 214.0 165.0 99.0 5.0 5.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 218.0 253.0 11.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 217.0 252.0 92.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 200.0 252.0 252.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 79.0 204.0 250.0 24.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 79.0 249.0 149.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 109.0 252.0 241.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 207.0 252.0 241.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 126.0 252.0 241.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 160.0 252.0 241.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 229.0 252.0 253.0 103.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 53.0 184.0 255.0 171.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 121.0 253.0 228.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 121.0 253.0 228.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 121.0 253.0 228.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 121.0 253.0 228.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 213.0 253.0 235.0 28.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 201.0 253.0 252.0 96.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 121.0 253.0 252.0 96.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 121.0 253.0 252.0 96.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 195.0 241.0 50.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 113.0 193.0 254.0 253.0 254.0 253.0 254.0 172.0 82.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 183.0 253.0 252.0 253.0 252.0 253.0 252.0 253.0 252.0 243.0 40.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 203.0 255.0 233.0 183.0 102.0 203.0 203.0 234.0 253.0 254.0 151.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 81.0 151.0 50.0 0.0 0.0 0.0 41.0 193.0 252.0 253.0 111.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 213.0 254.0 253.0 203.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 123.0 213.0 252.0 253.0 252.0 81.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 51.0 253.0 254.0 253.0 254.0 151.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 10.0 212.0 253.0 252.0 253.0 232.0 223.0 122.0 82.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 123.0 223.0 254.0 253.0 254.0 253.0 254.0 71.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 20.0 50.0 131.0 213.0 252.0 253.0 192.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 162.0 254.0 253.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 203.0 253.0 252.0 61.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 132.0 253.0 254.0 91.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 142.0 253.0 252.0 233.0 30.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 41.0 214.0 253.0 254.0 213.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 163.0 243.0 253.0 252.0 172.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 173.0 173.0 253.0 255.0 253.0 224.0 81.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 132.0 252.0 253.0 252.0 253.0 171.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 153.0 253.0 244.0 203.0 82.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 92.0 192.0 122.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 203.0 193.0 30.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 203.0 253.0 131.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 102.0 254.0 151.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 102.0 253.0 151.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 41.0 254.0 253.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 253.0 252.0 82.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 152.0 253.0 203.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 152.0 252.0 203.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 92.0 253.0 214.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 10.0 212.0 253.0 50.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 203.0 254.0 112.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 162.0 253.0 151.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 102.0 254.0 151.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 102.0 253.0 192.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 102.0 254.0 253.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 102.0 253.0 252.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 41.0 255.0 253.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 253.0 252.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 173.0 253.0 62.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 51.0 252.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 99.0 254.0 254.0 254.0 254.0 217.0 118.0 41.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 178.0 247.0 253.0 253.0 253.0 253.0 253.0 253.0 140.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 244.0 253.0 208.0 177.0 177.0 55.0 99.0 253.0 249.0 92.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 19.0 165.0 179.0 25.0 0.0 0.0 0.0 69.0 253.0 253.0 109.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 69.0 253.0 249.0 95.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 13.0 153.0 253.0 143.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 57.0 240.0 253.0 253.0 89.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 111.0 247.0 253.0 253.0 227.0 41.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 31.0 228.0 253.0 253.0 253.0 253.0 253.0 221.0 88.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 35.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 252.0 206.0 48.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 28.0 205.0 205.0 205.0 82.0 68.0 68.0 188.0 253.0 253.0 226.0 51.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 58.0 167.0 253.0 253.0 224.0 36.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 176.0 253.0 253.0 58.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 173.0 253.0 221.0 37.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 104.0 253.0 253.0 75.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 41.0 227.0 253.0 253.0 75.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 12.0 63.0 140.0 226.0 253.0 253.0 238.0 57.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 41.0 42.0 153.0 193.0 253.0 253.0 253.0 253.0 217.0 86.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 29.0 158.0 251.0 253.0 253.0 253.0 253.0 253.0 232.0 102.0 13.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 16.0 116.0 186.0 253.0 253.0 253.0 227.0 116.0 113.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 16.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 187.0 176.0 76.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 22.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 137.0 254.0 113.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 134.0 139.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 108.0 254.0 113.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 69.0 248.0 254.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 213.0 254.0 113.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 133.0 254.0 204.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 44.0 240.0 254.0 113.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 202.0 254.0 78.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 101.0 254.0 254.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 7.0 207.0 245.0 16.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 12.0 216.0 254.0 173.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 86.0 254.0 153.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 155.0 254.0 254.0 47.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 184.0 254.0 153.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 78.0 240.0 254.0 222.0 8.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 15.0 206.0 254.0 153.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 14.0 203.0 254.0 254.0 48.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 48.0 254.0 254.0 54.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 36.0 254.0 254.0 173.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 48.0 254.0 254.0 35.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 71.0 204.0 254.0 218.0 25.0 0.0 1.0 12.0 12.0 12.0 7.0 12.0 12.0 1.0 0.0 48.0 254.0 173.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 150.0 254.0 254.0 225.0 148.0 148.0 151.0 254.0 254.0 255.0 205.0 254.0 254.0 90.0 13.0 118.0 254.0 157.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 233.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 218.0 225.0 211.0 254.0 203.0 224.0 254.0 53.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 107.0 254.0 254.0 224.0 201.0 189.0 189.0 123.0 71.0 71.0 17.0 27.0 7.0 69.0 178.0 254.0 207.0 15.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 53.0 53.0 28.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 148.0 254.0 150.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 35.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 228.0 211.0 89.0 0.0 0.0 0.0 0.0 0.0 0.0 51.0 121.0 121.0 226.0 253.0 232.0 44.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 61.0 235.0 249.0 240.0 240.0 240.0 240.0 240.0 241.0 245.0 252.0 252.0 252.0 252.0 252.0 93.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 183.0 252.0 252.0 252.0 252.0 252.0 253.0 252.0 252.0 252.0 252.0 252.0 252.0 93.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 39.0 39.0 53.0 95.0 39.0 39.0 39.0 39.0 219.0 252.0 252.0 197.0 63.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 75.0 244.0 252.0 209.0 17.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 122.0 252.0 252.0 198.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 95.0 244.0 252.0 252.0 177.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 13.0 241.0 252.0 252.0 126.0 24.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 8.0 197.0 252.0 252.0 248.0 50.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 8.0 196.0 253.0 252.0 252.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 13.0 197.0 253.0 255.0 253.0 159.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 17.0 123.0 252.0 252.0 253.0 252.0 103.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 90.0 252.0 252.0 252.0 253.0 37.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 17.0 198.0 252.0 252.0 209.0 110.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 18.0 176.0 252.0 252.0 248.0 88.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 17.0 107.0 252.0 252.0 252.0 140.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 171.0 252.0 252.0 252.0 233.0 33.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 10.0 217.0 252.0 252.0 252.0 140.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 89.0 250.0 252.0 252.0 221.0 39.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 213.0 217.0 217.0 79.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 36.0 125.0 191.0 218.0 255.0 254.0 254.0 241.0 51.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 204.0 249.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 250.0 235.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 88.0 241.0 251.0 253.0 225.0 142.0 49.0 12.0 12.0 12.0 105.0 253.0 253.0 111.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 95.0 225.0 253.0 167.0 113.0 14.0 0.0 0.0 0.0 0.0 0.0 16.0 211.0 253.0 117.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 91.0 238.0 253.0 170.0 28.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 150.0 253.0 117.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 98.0 251.0 218.0 48.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 150.0 253.0 117.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 112.0 253.0 112.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 9.0 184.0 242.0 18.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 20.0 45.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 67.0 253.0 240.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 27.0 234.0 248.0 105.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 44.0 157.0 253.0 132.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 189.0 253.0 203.0 27.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 156.0 253.0 246.0 77.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 156.0 253.0 202.0 68.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 156.0 253.0 226.0 71.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 30.0 33.0 33.0 140.0 163.0 186.0 253.0 226.0 38.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 12.0 81.0 244.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 186.0 70.0 23.0 0.0 0.0 22.0 156.0 77.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 80.0 195.0 253.0 253.0 253.0 253.0 253.0 248.0 234.0 166.0 248.0 253.0 253.0 240.0 150.0 73.0 144.0 104.0 51.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 7.0 248.0 253.0 253.0 253.0 253.0 253.0 242.0 105.0 0.0 0.0 107.0 242.0 253.0 253.0 253.0 245.0 160.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 57.0 250.0 253.0 253.0 253.0 247.0 135.0 21.0 0.0 0.0 0.0 0.0 21.0 117.0 183.0 183.0 48.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 121.0 123.0 176.0 135.0 16.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 61.0 156.0 148.0 89.0 81.0 156.0 255.0 254.0 254.0 254.0 216.0 156.0 148.0 41.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 26.0 207.0 254.0 253.0 253.0 253.0 245.0 234.0 195.0 233.0 233.0 233.0 246.0 253.0 241.0 24.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 166.0 253.0 254.0 253.0 253.0 128.0 48.0 0.0 0.0 0.0 0.0 0.0 48.0 226.0 253.0 87.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 174.0 251.0 253.0 244.0 124.0 19.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 214.0 253.0 19.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 132.0 253.0 253.0 177.0 45.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 46.0 244.0 253.0 19.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 195.0 90.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 179.0 254.0 152.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 8.0 254.0 251.0 72.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 165.0 254.0 165.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 37.0 248.0 254.0 46.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 77.0 253.0 171.0 9.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 19.0 239.0 254.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 92.0 253.0 253.0 215.0 214.0 214.0 181.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 19.0 167.0 253.0 253.0 253.0 254.0 253.0 253.0 213.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 201.0 253.0 253.0 253.0 185.0 117.0 34.0 19.0 16.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 119.0 73.0 193.0 237.0 36.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 80.0 254.0 214.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 118.0 253.0 168.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 118.0 253.0 117.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 118.0 253.0 117.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 72.0 193.0 34.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 13.0 218.0 209.0 62.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 189.0 252.0 185.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 169.0 252.0 215.0 6.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 169.0 252.0 253.0 63.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 169.0 252.0 253.0 63.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 109.0 253.0 254.0 168.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 252.0 253.0 168.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 59.0 249.0 253.0 210.0 11.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 211.0 253.0 252.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 211.0 253.0 252.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 212.0 255.0 253.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 211.0 253.0 252.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 211.0 253.0 252.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 167.0 253.0 252.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 211.0 253.0 252.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 212.0 255.0 253.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 131.0 253.0 252.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 106.0 253.0 252.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 106.0 253.0 252.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 18.0 209.0 182.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 50.0 170.0 254.0 59.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 36.0 191.0 245.0 254.0 254.0 175.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 70.0 242.0 254.0 235.0 233.0 254.0 182.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 23.0 184.0 254.0 243.0 99.0 27.0 110.0 254.0 182.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 20.0 205.0 247.0 98.0 26.0 0.0 0.0 110.0 254.0 149.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 40.0 104.0 20.0 0.0 0.0 0.0 0.0 110.0 254.0 33.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 110.0 234.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 32.0 214.0 149.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 134.0 200.0 16.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 20.0 231.0 144.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 146.0 244.0 72.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 16.0 201.0 132.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 164.0 226.0 31.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 122.0 205.0 47.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 79.0 255.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 15.0 84.0 216.0 250.0 144.0 12.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 7.0 207.0 228.0 37.0 0.0 0.0 0.0 0.0 20.0 136.0 238.0 254.0 228.0 63.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 135.0 254.0 66.0 0.0 0.0 0.0 53.0 190.0 254.0 254.0 197.0 117.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 231.0 182.0 0.0 32.0 101.0 184.0 249.0 239.0 179.0 96.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 254.0 99.0 128.0 232.0 254.0 251.0 185.0 59.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 221.0 254.0 254.0 254.0 254.0 192.0 70.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 55.0 254.0 254.0 188.0 105.0 72.0 11.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 66.0 222.0 29.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 31.0 223.0 254.0 127.0 9.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 66.0 254.0 254.0 254.0 173.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 181.0 254.0 254.0 254.0 173.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 181.0 254.0 254.0 254.0 158.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 181.0 254.0 254.0 243.0 42.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 34.0 230.0 254.0 254.0 179.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 135.0 254.0 254.0 254.0 155.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 10.0 192.0 254.0 254.0 254.0 55.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 44.0 254.0 254.0 254.0 254.0 55.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 44.0 254.0 254.0 254.0 236.0 41.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 44.0 254.0 254.0 254.0 186.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 44.0 254.0 254.0 254.0 86.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 44.0 254.0 254.0 202.0 11.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 23.0 215.0 254.0 246.0 99.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 27.0 223.0 254.0 254.0 186.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 19.0 208.0 254.0 254.0 186.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 23.0 215.0 254.0 254.0 186.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 24.0 217.0 254.0 254.0 186.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 114.0 255.0 255.0 125.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 161.0 31.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 217.0 151.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 133.0 231.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 78.0 231.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 66.0 234.0 9.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 54.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 54.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 54.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 93.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 84.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 31.0 255.0 77.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 78.0 254.0 54.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 78.0 233.0 7.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 231.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 165.0 231.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 231.0 212.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 231.0 151.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 7.0 233.0 78.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 54.0 253.0 38.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 101.0 253.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 22.0 97.0 181.0 254.0 255.0 221.0 106.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 28.0 128.0 213.0 245.0 254.0 254.0 246.0 239.0 254.0 254.0 94.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 27.0 151.0 239.0 254.0 254.0 222.0 204.0 189.0 70.0 27.0 215.0 254.0 98.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 43.0 248.0 254.0 233.0 40.0 15.0 0.0 0.0 0.0 0.0 96.0 254.0 111.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 121.0 72.0 33.0 0.0 0.0 0.0 0.0 0.0 0.0 76.0 254.0 187.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 94.0 254.0 149.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 124.0 254.0 40.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 203.0 174.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 102.0 254.0 122.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 40.0 223.0 205.0 254.0 115.0 33.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 40.0 248.0 254.0 254.0 254.0 242.0 191.0 71.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 140.0 254.0 254.0 248.0 209.0 254.0 213.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 186.0 208.0 71.0 49.0 74.0 191.0 134.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 134.0 254.0 119.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 16.0 197.0 168.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 140.0 225.0 43.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 51.0 233.0 106.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 161.0 227.0 17.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 228.0 124.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 168.0 6.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 121.0 255.0 165.0 0.0 0.0 0.0 0.0 0.0 0.0 70.0 254.0 179.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 131.0 254.0 153.0 0.0 0.0 0.0 0.0 0.0 0.0 106.0 254.0 249.0 50.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 216.0 254.0 105.0 0.0 0.0 0.0 0.0 0.0 0.0 140.0 254.0 240.0 37.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 14.0 225.0 254.0 84.0 0.0 0.0 0.0 0.0 0.0 85.0 233.0 254.0 215.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 58.0 254.0 254.0 46.0 0.0 0.0 0.0 0.0 8.0 186.0 254.0 254.0 206.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 58.0 254.0 254.0 9.0 0.0 0.0 0.0 0.0 146.0 254.0 254.0 254.0 120.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 150.0 254.0 254.0 9.0 0.0 0.0 0.0 127.0 251.0 254.0 254.0 239.0 22.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 153.0 254.0 254.0 9.0 0.0 0.0 92.0 246.0 254.0 254.0 254.0 181.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 105.0 241.0 254.0 40.0 0.0 27.0 244.0 254.0 254.0 254.0 254.0 150.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 161.0 254.0 169.0 100.0 244.0 254.0 254.0 254.0 254.0 252.0 70.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 68.0 176.0 253.0 254.0 254.0 245.0 167.0 254.0 254.0 202.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 99.0 177.0 146.0 35.0 110.0 254.0 254.0 148.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 206.0 254.0 254.0 131.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 130.0 254.0 219.0 11.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 174.0 254.0 210.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 155.0 254.0 124.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 185.0 254.0 115.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 206.0 254.0 115.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 194.0 254.0 115.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 27.0 192.0 115.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 41.0 102.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 82.0 214.0 253.0 163.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 31.0 232.0 223.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 203.0 244.0 40.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 41.0 243.0 162.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 72.0 253.0 41.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 41.0 233.0 212.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 173.0 224.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 132.0 252.0 162.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 254.0 192.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 203.0 233.0 50.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 132.0 253.0 102.0 0.0 31.0 51.0 51.0 51.0 113.0 112.0 113.0 152.0 132.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 82.0 253.0 252.0 223.0 203.0 233.0 252.0 253.0 252.0 253.0 252.0 253.0 252.0 253.0 91.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 51.0 173.0 253.0 254.0 253.0 254.0 213.0 102.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 163.0 203.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 123.0 213.0 252.0 253.0 252.0 192.0 111.0 50.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 40.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 173.0 253.0 255.0 253.0 224.0 40.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 253.0 252.0 253.0 130.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 102.0 102.0 41.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 23.0 151.0 255.0 254.0 163.0 32.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 23.0 211.0 253.0 253.0 253.0 253.0 68.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 155.0 241.0 152.0 135.0 248.0 253.0 185.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 140.0 84.0 0.0 0.0 162.0 247.0 192.0 6.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 7.0 194.0 253.0 55.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 56.0 253.0 253.0 55.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 78.0 253.0 208.0 19.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 180.0 253.0 185.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 36.0 232.0 253.0 200.0 56.0 11.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 50.0 253.0 253.0 253.0 253.0 159.0 41.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 37.0 185.0 235.0 253.0 253.0 253.0 190.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 41.0 89.0 201.0 253.0 253.0 206.0 24.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 15.0 214.0 253.0 253.0 30.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 205.0 253.0 253.0 30.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 26.0 129.0 246.0 253.0 219.0 19.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 74.0 202.0 253.0 253.0 219.0 37.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 97.0 230.0 247.0 253.0 253.0 168.0 37.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 96.0 248.0 253.0 253.0 253.0 129.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 167.0 253.0 253.0 253.0 130.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 107.0 253.0 226.0 38.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 163.0 193.0 152.0 92.0 51.0 51.0 51.0 51.0 31.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 223.0 253.0 252.0 253.0 252.0 253.0 252.0 253.0 192.0 82.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 51.0 253.0 102.0 0.0 21.0 102.0 62.0 102.0 102.0 61.0 183.0 40.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 51.0 252.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 61.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 51.0 253.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 92.0 252.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 173.0 253.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 253.0 252.0 223.0 203.0 203.0 203.0 82.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 123.0 254.0 253.0 224.0 203.0 203.0 223.0 254.0 71.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 41.0 243.0 253.0 130.0 20.0 0.0 0.0 20.0 253.0 232.0 41.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 152.0 253.0 183.0 0.0 0.0 0.0 0.0 0.0 132.0 253.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 51.0 151.0 20.0 0.0 0.0 0.0 0.0 0.0 51.0 252.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 113.0 253.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 82.0 183.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 193.0 252.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 203.0 183.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 254.0 253.0 41.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 223.0 102.0 0.0 0.0 0.0 0.0 0.0 21.0 203.0 253.0 130.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 204.0 123.0 0.0 0.0 0.0 0.0 41.0 173.0 253.0 203.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 162.0 223.0 102.0 21.0 102.0 163.0 243.0 253.0 171.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 41.0 234.0 253.0 255.0 253.0 255.0 172.0 82.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 30.0 131.0 192.0 111.0 50.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 151.0 253.0 167.0 9.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 25.0 222.0 252.0 252.0 66.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 198.0 252.0 252.0 187.0 13.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 140.0 252.0 252.0 252.0 90.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 70.0 248.0 252.0 252.0 142.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 193.0 252.0 252.0 229.0 39.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 69.0 252.0 252.0 252.0 211.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 10.0 235.0 252.0 252.0 226.0 14.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 121.0 252.0 252.0 253.0 77.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 195.0 252.0 253.0 201.0 19.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 188.0 253.0 255.0 253.0 44.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 158.0 252.0 253.0 252.0 121.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 78.0 252.0 253.0 252.0 192.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 212.0 253.0 252.0 252.0 116.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 111.0 253.0 252.0 252.0 192.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 72.0 253.0 252.0 252.0 238.0 31.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 200.0 252.0 252.0 252.0 140.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 125.0 252.0 252.0 252.0 197.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 34.0 252.0 252.0 252.0 116.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 110.0 233.0 243.0 50.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 76.0 174.0 226.0 255.0 185.0 53.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 222.0 83.0 68.0 74.0 186.0 243.0 122.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 95.0 11.0 0.0 0.0 7.0 114.0 242.0 97.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 7.0 114.0 222.0 24.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 24.0 219.0 167.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 71.0 223.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 44.0 249.0 84.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 182.0 165.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 218.0 165.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 241.0 165.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 65.0 254.0 97.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 65.0 254.0 38.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 72.0 79.0 102.0 20.0 0.0 0.0 165.0 181.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 20.0 159.0 242.0 246.0 246.0 242.0 119.0 59.0 253.0 95.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 187.0 223.0 35.0 0.0 5.0 116.0 243.0 254.0 207.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 28.0 243.0 103.0 0.0 0.0 0.0 0.0 81.0 254.0 218.0 18.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 63.0 254.0 32.0 0.0 0.0 0.0 78.0 244.0 214.0 226.0 200.0 16.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 37.0 254.0 50.0 0.0 56.0 93.0 245.0 214.0 30.0 42.0 227.0 202.0 58.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 192.0 241.0 230.0 253.0 254.0 167.0 29.0 0.0 0.0 40.0 134.0 244.0 184.0 69.0 32.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 22.0 137.0 173.0 94.0 12.0 3.0 0.0 0.0 0.0 0.0 1.0 102.0 209.0 240.0 54.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 111.0 133.0 82.0 1.0 0.0 0.0 0.0 3.0 100.0 168.0 214.0 19.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 85.0 253.0 253.0 253.0 11.0 0.0 0.0 4.0 127.0 253.0 253.0 253.0 36.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 56.0 231.0 253.0 253.0 238.0 10.0 0.0 0.0 37.0 253.0 253.0 253.0 253.0 111.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 182.0 253.0 253.0 253.0 144.0 0.0 0.0 0.0 37.0 253.0 253.0 253.0 253.0 133.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 233.0 253.0 253.0 253.0 58.0 0.0 0.0 0.0 37.0 253.0 253.0 253.0 253.0 36.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 194.0 253.0 253.0 253.0 253.0 24.0 0.0 4.0 85.0 202.0 253.0 253.0 253.0 253.0 36.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 37.0 253.0 253.0 253.0 253.0 253.0 101.0 85.0 209.0 253.0 253.0 253.0 253.0 253.0 184.0 7.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 141.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 254.0 253.0 253.0 253.0 253.0 253.0 65.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 106.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 254.0 253.0 253.0 253.0 253.0 187.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 37.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 254.0 253.0 253.0 253.0 253.0 180.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 35.0 248.0 242.0 149.0 220.0 242.0 242.0 242.0 244.0 254.0 254.0 255.0 254.0 175.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 52.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 191.0 253.0 253.0 253.0 60.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 145.0 253.0 253.0 253.0 77.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 9.0 218.0 253.0 253.0 253.0 180.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 42.0 253.0 253.0 253.0 253.0 151.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 226.0 253.0 253.0 253.0 253.0 60.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 99.0 254.0 253.0 253.0 253.0 253.0 60.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 122.0 254.0 253.0 253.0 253.0 230.0 37.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 12.0 254.0 253.0 253.0 253.0 83.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 253.0 160.0 11.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 113.0 213.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 51.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 233.0 252.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 51.0 252.0 82.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 253.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 51.0 253.0 163.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 253.0 252.0 41.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 51.0 252.0 223.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 253.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 51.0 253.0 254.0 50.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 253.0 252.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 51.0 252.0 253.0 50.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 253.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 51.0 253.0 254.0 50.0 52.0 131.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 253.0 252.0 61.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 92.0 252.0 213.0 51.0 193.0 151.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 253.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 152.0 253.0 254.0 253.0 203.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 253.0 252.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 41.0 193.0 252.0 253.0 212.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 193.0 253.0 254.0 131.0 51.0 51.0 51.0 132.0 214.0 253.0 254.0 253.0 254.0 50.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 51.0 232.0 253.0 252.0 253.0 252.0 253.0 252.0 253.0 252.0 253.0 252.0 213.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 82.0 234.0 253.0 254.0 253.0 244.0 203.0 142.0 102.0 254.0 253.0 183.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 30.0 50.0 50.0 50.0 40.0 0.0 0.0 0.0 253.0 252.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 152.0 253.0 203.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 233.0 252.0 122.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 253.0 103.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 253.0 252.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 173.0 253.0 103.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 10.0 172.0 61.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 35.0 156.0 246.0 58.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 28.0 217.0 253.0 250.0 54.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 127.0 253.0 253.0 153.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 53.0 246.0 253.0 195.0 9.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 135.0 254.0 200.0 18.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 100.0 254.0 241.0 30.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 7.0 183.0 253.0 105.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 79.0 253.0 185.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 191.0 134.0 216.0 34.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 46.0 244.0 253.0 79.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 217.0 254.0 183.0 8.0 0.0 0.0 0.0 41.0 27.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 253.0 78.0 0.0 16.0 140.0 214.0 241.0 217.0 72.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 61.0 254.0 247.0 54.0 0.0 135.0 152.0 166.0 253.0 253.0 223.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 195.0 254.0 180.0 0.0 0.0 0.0 0.0 12.0 223.0 253.0 253.0 76.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 195.0 254.0 99.0 0.0 0.0 0.0 0.0 20.0 253.0 253.0 215.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 196.0 255.0 136.0 0.0 0.0 0.0 0.0 20.0 254.0 254.0 133.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 195.0 254.0 190.0 88.0 2.0 0.0 5.0 76.0 253.0 250.0 54.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 223.0 253.0 253.0 166.0 79.0 156.0 253.0 253.0 146.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 8.0 72.0 202.0 253.0 253.0 253.0 254.0 253.0 225.0 23.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 58.0 200.0 215.0 193.0 73.0 18.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 25.0 60.0 60.0 131.0 209.0 209.0 209.0 209.0 209.0 209.0 211.0 174.0 60.0 32.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 202.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 254.0 253.0 253.0 211.0 28.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 254.0 253.0 253.0 253.0 178.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 91.0 178.0 178.0 178.0 178.0 178.0 99.0 29.0 29.0 29.0 91.0 240.0 253.0 253.0 178.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 93.0 240.0 253.0 253.0 160.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 24.0 134.0 254.0 253.0 253.0 253.0 29.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 27.0 90.0 90.0 232.0 242.0 253.0 254.0 253.0 253.0 253.0 109.0 80.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 93.0 212.0 253.0 253.0 253.0 253.0 253.0 254.0 253.0 253.0 253.0 253.0 246.0 116.0 46.0 11.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 120.0 253.0 253.0 253.0 253.0 253.0 253.0 254.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 147.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 121.0 254.0 254.0 254.0 155.0 124.0 0.0 0.0 0.0 0.0 72.0 149.0 224.0 254.0 255.0 254.0 105.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 44.0 44.0 44.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 49.0 225.0 253.0 253.0 139.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 48.0 244.0 253.0 253.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 72.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 246.0 253.0 182.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 67.0 241.0 145.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 72.0 240.0 253.0 253.0 104.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 75.0 253.0 253.0 183.0 179.0 179.0 119.0 66.0 179.0 179.0 179.0 232.0 253.0 242.0 196.0 31.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 36.0 214.0 253.0 253.0 253.0 253.0 254.0 253.0 253.0 253.0 253.0 253.0 253.0 163.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 10.0 94.0 163.0 179.0 200.0 255.0 253.0 253.0 253.0 226.0 163.0 163.0 17.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 24.0 59.0 95.0 111.0 59.0 42.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 9.0 77.0 50.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 63.0 119.0 171.0 242.0 243.0 202.0 98.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 49.0 21.0 0.0 24.0 119.0 204.0 254.0 255.0 227.0 128.0 107.0 7.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 30.0 187.0 254.0 232.0 215.0 234.0 254.0 241.0 159.0 74.0 18.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 18.0 217.0 254.0 254.0 254.0 251.0 221.0 105.0 34.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 18.0 199.0 254.0 254.0 249.0 162.0 66.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 187.0 254.0 254.0 196.0 31.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 57.0 240.0 254.0 163.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 222.0 254.0 161.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 34.0 242.0 248.0 76.0 34.0 107.0 134.0 218.0 177.0 93.0 26.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 117.0 254.0 248.0 241.0 243.0 254.0 235.0 223.0 240.0 254.0 236.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 198.0 254.0 254.0 201.0 144.0 58.0 22.0 0.0 31.0 142.0 250.0 233.0 104.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 18.0 151.0 85.0 15.0 0.0 0.0 0.0 0.0 0.0 0.0 132.0 254.0 175.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 108.0 254.0 254.0 9.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 33.0 209.0 254.0 176.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 228.0 254.0 233.0 45.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 14.0 98.0 182.0 250.0 254.0 231.0 79.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 28.0 27.0 27.0 103.0 117.0 151.0 222.0 254.0 254.0 240.0 142.0 28.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 242.0 249.0 250.0 253.0 247.0 245.0 241.0 184.0 100.0 30.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 46.0 49.0 65.0 34.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 38.0 154.0 215.0 241.0 77.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 81.0 233.0 177.0 70.0 23.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 52.0 146.0 146.0 149.0 177.0 224.0 115.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 221.0 207.0 161.0 184.0 106.0 43.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 248.0 62.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 53.0 252.0 62.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 68.0 253.0 62.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 146.0 254.0 62.0 0.0 0.0 4.0 31.0 13.0 32.0 55.0 31.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 107.0 254.0 62.0 14.0 83.0 214.0 254.0 226.0 254.0 254.0 254.0 181.0 65.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 70.0 254.0 154.0 225.0 251.0 167.0 84.0 70.0 23.0 23.0 91.0 179.0 250.0 105.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 22.0 204.0 220.0 154.0 33.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 110.0 255.0 53.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 9.0 210.0 230.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 95.0 250.0 40.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 62.0 254.0 69.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 74.0 248.0 17.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 181.0 246.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 31.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 18.0 229.0 192.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 14.0 236.0 78.0 2.0 0.0 0.0 0.0 0.0 0.0 18.0 161.0 233.0 185.0 9.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 114.0 254.0 90.0 32.0 12.0 55.0 85.0 168.0 234.0 234.0 129.0 7.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 130.0 226.0 244.0 236.0 254.0 247.0 176.0 109.0 40.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 16.0 206.0 217.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 17.0 205.0 253.0 216.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 17.0 205.0 253.0 251.0 139.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 136.0 253.0 253.0 149.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 20.0 208.0 253.0 238.0 39.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 209.0 253.0 253.0 149.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 253.0 241.0 36.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 253.0 235.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 38.0 50.0 50.0 50.0 50.0 50.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 253.0 235.0 0.0 0.0 0.0 0.0 0.0 68.0 180.0 236.0 253.0 253.0 253.0 253.0 253.0 187.0 126.0 30.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 253.0 235.0 0.0 0.0 0.0 0.0 13.0 198.0 253.0 253.0 204.0 191.0 148.0 128.0 176.0 247.0 253.0 222.0 126.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 253.0 140.0 0.0 0.0 0.0 0.0 144.0 253.0 253.0 168.0 14.0 0.0 0.0 0.0 0.0 108.0 215.0 253.0 253.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 253.0 208.0 0.0 0.0 0.0 0.0 174.0 253.0 253.0 61.0 0.0 0.0 0.0 0.0 0.0 0.0 112.0 253.0 253.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 253.0 235.0 0.0 0.0 0.0 0.0 174.0 253.0 253.0 61.0 0.0 0.0 0.0 0.0 0.0 0.0 112.0 253.0 214.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 253.0 241.0 36.0 0.0 0.0 0.0 174.0 253.0 253.0 164.0 0.0 0.0 0.0 0.0 0.0 0.0 112.0 253.0 87.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 103.0 253.0 253.0 232.0 85.0 0.0 0.0 25.0 125.0 229.0 244.0 181.0 64.0 0.0 0.0 0.0 0.0 157.0 253.0 112.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 207.0 253.0 253.0 208.0 0.0 0.0 0.0 0.0 114.0 229.0 253.0 244.0 87.0 0.0 0.0 42.0 243.0 253.0 81.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 25.0 253.0 253.0 250.0 150.0 36.0 0.0 0.0 0.0 52.0 148.0 181.0 245.0 184.0 106.0 228.0 253.0 95.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 88.0 207.0 253.0 253.0 242.0 211.0 112.0 112.0 112.0 112.0 118.0 172.0 253.0 253.0 207.0 26.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 80.0 135.0 210.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 213.0 135.0 87.0 7.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 27.0 129.0 129.0 129.0 129.0 129.0 129.0 25.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 10.0 29.0 4.0 104.0 229.0 253.0 129.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 85.0 252.0 179.0 252.0 252.0 252.0 253.0 122.0 13.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 123.0 252.0 253.0 252.0 148.0 56.0 253.0 252.0 143.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 51.0 246.0 252.0 253.0 102.0 6.0 0.0 153.0 252.0 168.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 170.0 253.0 253.0 255.0 84.0 0.0 0.0 13.0 207.0 253.0 91.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 169.0 252.0 252.0 247.0 65.0 0.0 0.0 0.0 169.0 252.0 215.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 169.0 252.0 252.0 100.0 0.0 0.0 0.0 0.0 82.0 252.0 252.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 26.0 243.0 252.0 252.0 0.0 0.0 0.0 0.0 0.0 57.0 252.0 252.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 41.0 253.0 253.0 253.0 0.0 0.0 0.0 0.0 0.0 57.0 253.0 253.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 141.0 252.0 252.0 252.0 0.0 0.0 0.0 0.0 0.0 57.0 252.0 252.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 229.0 252.0 224.0 168.0 0.0 0.0 0.0 0.0 0.0 57.0 252.0 252.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 253.0 252.0 168.0 0.0 0.0 0.0 0.0 0.0 0.0 57.0 252.0 252.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 253.0 168.0 0.0 0.0 0.0 0.0 0.0 0.0 120.0 253.0 190.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 253.0 252.0 93.0 0.0 0.0 0.0 0.0 0.0 0.0 169.0 252.0 65.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 253.0 252.0 56.0 0.0 0.0 0.0 0.0 0.0 10.0 197.0 252.0 28.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 253.0 252.0 156.0 0.0 0.0 0.0 0.0 0.0 179.0 252.0 177.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 179.0 253.0 178.0 16.0 0.0 19.0 66.0 191.0 254.0 209.0 25.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 22.0 234.0 252.0 215.0 169.0 225.0 252.0 252.0 209.0 28.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 131.0 252.0 252.0 253.0 252.0 252.0 214.0 25.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 7.0 65.0 240.0 253.0 177.0 103.0 15.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 92.0 253.0 141.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 19.0 196.0 252.0 241.0 24.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 147.0 225.0 97.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 57.0 252.0 252.0 253.0 27.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 32.0 253.0 252.0 195.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 57.0 252.0 252.0 178.0 9.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 140.0 253.0 252.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 57.0 252.0 252.0 140.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 16.0 203.0 253.0 252.0 55.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 120.0 253.0 253.0 141.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 29.0 253.0 255.0 215.0 31.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 197.0 252.0 252.0 140.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 29.0 252.0 253.0 42.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 197.0 252.0 252.0 31.0 0.0 0.0 0.0 0.0 0.0 0.0 13.0 79.0 252.0 253.0 27.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 57.0 234.0 252.0 236.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 57.0 252.0 252.0 178.0 9.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 85.0 252.0 252.0 189.0 141.0 140.0 140.0 140.0 140.0 79.0 48.0 165.0 252.0 252.0 140.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 86.0 253.0 253.0 253.0 255.0 253.0 253.0 253.0 253.0 255.0 253.0 253.0 253.0 253.0 141.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 57.0 233.0 252.0 252.0 253.0 252.0 252.0 242.0 214.0 215.0 243.0 252.0 252.0 252.0 140.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 75.0 195.0 195.0 56.0 55.0 55.0 49.0 31.0 31.0 50.0 209.0 252.0 220.0 31.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 73.0 234.0 252.0 112.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 225.0 252.0 252.0 112.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 226.0 253.0 253.0 112.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 101.0 249.0 252.0 242.0 74.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 113.0 252.0 252.0 246.0 88.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 38.0 234.0 252.0 154.0 99.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 146.0 252.0 84.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 77.0 254.0 103.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 203.0 253.0 217.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 253.0 199.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 253.0 96.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 247.0 73.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 35.0 254.0 229.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 162.0 254.0 130.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 242.0 254.0 109.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 100.0 252.0 243.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 110.0 253.0 127.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 116.0 254.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 10.0 232.0 253.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 98.0 253.0 236.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 178.0 253.0 110.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 218.0 253.0 11.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 218.0 170.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 29.0 230.0 144.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 85.0 253.0 144.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 8.0 221.0 144.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 160.0 196.0 6.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 27.0 73.0 157.0 163.0 195.0 163.0 27.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 60.0 184.0 242.0 254.0 253.0 253.0 253.0 253.0 158.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 50.0 179.0 248.0 253.0 253.0 217.0 197.0 127.0 165.0 242.0 254.0 63.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 116.0 234.0 253.0 250.0 163.0 80.0 0.0 0.0 0.0 0.0 181.0 254.0 108.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 116.0 253.0 254.0 214.0 62.0 0.0 0.0 0.0 0.0 0.0 0.0 181.0 254.0 160.0 13.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 95.0 254.0 254.0 182.0 7.0 0.0 0.0 0.0 0.0 0.0 0.0 38.0 228.0 255.0 254.0 127.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 253.0 201.0 7.0 0.0 0.0 0.0 0.0 0.0 32.0 55.0 172.0 253.0 254.0 253.0 42.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 253.0 207.0 69.0 37.0 32.0 16.0 102.0 186.0 238.0 253.0 253.0 253.0 254.0 160.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 86.0 249.0 253.0 254.0 253.0 245.0 222.0 253.0 254.0 253.0 253.0 253.0 253.0 254.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 96.0 227.0 254.0 253.0 253.0 253.0 220.0 136.0 72.0 105.0 214.0 253.0 228.0 12.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 59.0 91.0 46.0 0.0 0.0 0.0 0.0 63.0 254.0 254.0 92.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 179.0 253.0 201.0 7.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 28.0 235.0 253.0 85.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 127.0 253.0 238.0 16.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 145.0 253.0 202.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 47.0 241.0 254.0 144.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 182.0 253.0 245.0 81.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 46.0 254.0 253.0 138.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 155.0 254.0 223.0 72.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 59.0 195.0 70.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 8.0 123.0 162.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 84.0 103.0 202.0 225.0 85.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 18.0 40.0 171.0 223.0 240.0 236.0 74.0 58.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 49.0 64.0 134.0 240.0 255.0 253.0 161.0 57.0 14.0 36.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 98.0 212.0 213.0 243.0 253.0 253.0 253.0 192.0 68.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 160.0 230.0 231.0 230.0 159.0 80.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 36.0 84.0 121.0 27.0 27.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 43.0 126.0 94.0 57.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 85.0 202.0 48.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 14.0 237.0 243.0 35.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 36.0 180.0 255.0 210.0 193.0 37.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 32.0 63.0 63.0 183.0 142.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 149.0 204.0 9.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 225.0 14.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 94.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 220.0 11.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 22.0 173.0 254.0 63.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 125.0 253.0 224.0 32.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 22.0 253.0 200.0 36.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 130.0 7.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 191.0 255.0 128.0 128.0 128.0 64.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 255.0 255.0 255.0 255.0 255.0 255.0 255.0 255.0 255.0 255.0 128.0 128.0 64.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 255.0 255.0 255.0 255.0 255.0 255.0 255.0 255.0 255.0 255.0 255.0 255.0 255.0 191.0 64.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 64.0 128.0 128.0 128.0 128.0 255.0 255.0 255.0 255.0 255.0 255.0 255.0 255.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 191.0 255.0 255.0 255.0 255.0 255.0 64.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 255.0 255.0 255.0 255.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 255.0 255.0 255.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 255.0 255.0 255.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 255.0 255.0 255.0 64.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 255.0 255.0 255.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 255.0 255.0 255.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 255.0 255.0 191.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 191.0 255.0 255.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 255.0 255.0 255.0 64.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 255.0 255.0 191.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 255.0 255.0 64.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 191.0 255.0 255.0 255.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 255.0 255.0 255.0 191.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 255.0 255.0 191.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 255.0 255.0 64.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 43.0 47.0 47.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 9.0 108.0 249.0 253.0 253.0 208.0 207.0 207.0 207.0 149.0 65.0 13.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 9.0 184.0 254.0 253.0 253.0 253.0 254.0 253.0 253.0 253.0 254.0 253.0 213.0 25.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 55.0 203.0 254.0 254.0 199.0 127.0 127.0 60.0 93.0 84.0 68.0 151.0 222.0 254.0 161.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 138.0 253.0 253.0 199.0 19.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 155.0 253.0 211.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 138.0 253.0 253.0 17.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 74.0 241.0 253.0 211.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 105.0 253.0 253.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 34.0 229.0 253.0 253.0 160.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 149.0 254.0 229.0 40.0 0.0 0.0 0.0 38.0 153.0 254.0 254.0 254.0 180.0 25.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 19.0 198.0 254.0 207.0 9.0 34.0 72.0 235.0 253.0 253.0 224.0 139.0 13.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 17.0 211.0 253.0 215.0 240.0 254.0 253.0 234.0 128.0 17.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 102.0 229.0 253.0 253.0 253.0 228.0 77.0 13.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 70.0 170.0 254.0 254.0 254.0 254.0 254.0 254.0 119.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 26.0 130.0 230.0 254.0 253.0 253.0 185.0 115.0 64.0 211.0 253.0 248.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 166.0 232.0 253.0 253.0 247.0 162.0 46.0 13.0 7.0 91.0 245.0 253.0 254.0 56.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 253.0 253.0 253.0 210.0 93.0 127.0 159.0 204.0 253.0 253.0 253.0 228.0 15.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 134.0 241.0 254.0 255.0 254.0 254.0 254.0 254.0 254.0 254.0 228.0 34.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 27.0 115.0 140.0 206.0 206.0 206.0 207.0 206.0 123.0 15.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 142.0 254.0 204.0 172.0 199.0 140.0 91.0 27.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 68.0 222.0 81.0 74.0 153.0 185.0 237.0 237.0 250.0 194.0 29.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 166.0 196.0 0.0 0.0 0.0 0.0 0.0 0.0 115.0 81.0 11.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 213.0 159.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 7.0 220.0 115.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 34.0 246.0 130.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 168.0 246.0 21.0 0.0 0.0 0.0 0.0 138.0 69.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 131.0 254.0 99.0 0.0 0.0 0.0 0.0 189.0 139.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 82.0 254.0 107.0 0.0 0.0 0.0 85.0 229.0 89.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 196.0 228.0 11.0 0.0 0.0 154.0 254.0 57.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 110.0 254.0 129.0 1.0 9.0 207.0 255.0 57.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 193.0 254.0 183.0 188.0 175.0 254.0 57.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 17.0 116.0 147.0 22.0 146.0 254.0 57.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 99.0 254.0 57.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 99.0 254.0 57.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 167.0 254.0 57.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 135.0 232.0 8.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 99.0 251.0 52.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 99.0 246.0 41.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 126.0 229.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 55.0 192.0 87.0 11.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 169.0 252.0 253.0 170.0 43.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 111.0 249.0 253.0 252.0 233.0 101.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 115.0 227.0 252.0 252.0 252.0 138.0 27.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 87.0 112.0 147.0 252.0 252.0 150.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 9.0 132.0 247.0 255.0 125.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 176.0 253.0 196.0 7.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 9.0 253.0 252.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 98.0 253.0 252.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 9.0 132.0 246.0 253.0 182.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 146.0 253.0 227.0 148.0 131.0 123.0 201.0 253.0 253.0 212.0 27.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 155.0 252.0 252.0 252.0 253.0 252.0 252.0 231.0 124.0 27.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 7.0 74.0 126.0 214.0 236.0 252.0 252.0 145.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 14.0 140.0 252.0 231.0 28.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 50.0 244.0 252.0 42.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 124.0 62.0 0.0 0.0 0.0 0.0 0.0 50.0 245.0 253.0 42.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 84.0 242.0 27.0 0.0 0.0 0.0 36.0 146.0 211.0 252.0 252.0 42.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 176.0 252.0 22.0 22.0 31.0 127.0 223.0 253.0 252.0 242.0 134.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 22.0 252.0 252.0 253.0 252.0 252.0 252.0 252.0 190.0 110.0 42.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 182.0 252.0 253.0 252.0 155.0 147.0 59.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 68.0 197.0 255.0 242.0 145.0 236.0 212.0 169.0 130.0 130.0 130.0 95.0 107.0 130.0 85.0 116.0 70.0 76.0 7.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 125.0 248.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 12.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 60.0 111.0 111.0 111.0 111.0 111.0 111.0 138.0 235.0 235.0 235.0 241.0 238.0 241.0 253.0 253.0 253.0 253.0 60.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 34.0 18.0 48.0 239.0 253.0 242.0 170.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 109.0 253.0 253.0 141.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 74.0 240.0 253.0 219.0 60.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 47.0 86.0 44.0 44.0 44.0 11.0 0.0 75.0 239.0 253.0 236.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 22.0 224.0 253.0 253.0 253.0 253.0 193.0 174.0 238.0 253.0 253.0 173.0 50.0 28.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 25.0 206.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 221.0 180.0 31.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 10.0 68.0 128.0 155.0 237.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 99.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 43.0 237.0 253.0 253.0 198.0 142.0 61.0 61.0 61.0 61.0 61.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 15.0 175.0 253.0 253.0 158.0 11.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 150.0 253.0 253.0 98.0 11.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 79.0 240.0 253.0 159.0 11.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 33.0 241.0 253.0 205.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 87.0 253.0 234.0 60.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 81.0 245.0 253.0 92.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 79.0 247.0 253.0 234.0 45.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 18.0 249.0 253.0 236.0 52.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 19.0 253.0 253.0 155.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 219.0 81.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 218.0 144.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 19.0 121.0 11.0 0.0 0.0 218.0 144.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 37.0 254.0 72.0 0.0 0.0 218.0 144.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 37.0 254.0 72.0 0.0 0.0 218.0 144.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 102.0 254.0 99.0 0.0 0.0 193.0 171.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 140.0 254.0 79.0 0.0 0.0 128.0 235.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 8.0 223.0 251.0 62.0 0.0 0.0 128.0 235.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 132.0 254.0 250.0 135.0 110.0 110.0 214.0 164.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 236.0 254.0 254.0 254.0 255.0 254.0 254.0 144.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 237.0 254.0 197.0 85.0 59.0 59.0 232.0 145.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 185.0 76.0 4.0 0.0 0.0 32.0 238.0 144.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 36.0 241.0 144.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 55.0 254.0 144.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 55.0 254.0 144.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 81.0 254.0 87.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 145.0 254.0 54.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 145.0 254.0 54.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 145.0 225.0 12.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 114.0 120.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 101.0 147.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 40.0 252.0 175.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 213.0 252.0 132.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 147.0 250.0 143.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 80.0 252.0 98.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 165.0 221.0 14.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 20.0 19.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 74.0 243.0 110.0 0.0 0.0 0.0 0.0 0.0 0.0 10.0 127.0 236.0 236.0 173.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 151.0 197.0 0.0 0.0 0.0 0.0 0.0 0.0 60.0 236.0 252.0 252.0 252.0 248.0 61.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 242.0 163.0 0.0 0.0 0.0 0.0 0.0 11.0 199.0 252.0 168.0 66.0 212.0 249.0 69.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 44.0 227.0 12.0 0.0 0.0 0.0 0.0 0.0 177.0 252.0 166.0 2.0 0.0 198.0 241.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 162.0 217.0 0.0 0.0 0.0 0.0 0.0 63.0 255.0 201.0 19.0 0.0 0.0 151.0 242.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 209.0 149.0 0.0 0.0 0.0 0.0 0.0 187.0 253.0 77.0 0.0 0.0 0.0 198.0 164.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 209.0 187.0 0.0 0.0 0.0 0.0 0.0 220.0 226.0 13.0 0.0 0.0 46.0 243.0 131.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 209.0 121.0 0.0 0.0 0.0 0.0 41.0 237.0 211.0 0.0 0.0 12.0 206.0 252.0 26.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 209.0 192.0 0.0 0.0 0.0 0.0 78.0 252.0 111.0 0.0 0.0 119.0 252.0 170.0 8.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 209.0 230.0 0.0 0.0 0.0 0.0 78.0 252.0 111.0 0.0 79.0 250.0 252.0 55.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 105.0 250.0 132.0 0.0 0.0 0.0 78.0 252.0 164.0 40.0 221.0 237.0 60.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 175.0 231.0 154.0 13.0 0.0 97.0 252.0 253.0 252.0 252.0 121.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 92.0 226.0 252.0 193.0 187.0 236.0 252.0 253.0 252.0 252.0 87.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 46.0 142.0 243.0 252.0 219.0 142.0 157.0 223.0 100.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 13.0 183.0 255.0 46.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 89.0 136.0 253.0 232.0 29.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 101.0 238.0 253.0 248.0 46.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 9.0 84.0 45.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 205.0 253.0 231.0 79.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 54.0 185.0 246.0 78.0 0.0 0.0 0.0 0.0 0.0 0.0 85.0 86.0 230.0 186.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 26.0 233.0 163.0 55.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 63.0 156.0 231.0 57.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 135.0 142.0 208.0 23.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 214.0 253.0 141.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 47.0 253.0 253.0 67.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 59.0 223.0 253.0 129.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 47.0 253.0 253.0 67.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 51.0 188.0 253.0 85.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 69.0 253.0 253.0 147.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 47.0 38.0 239.0 205.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 68.0 253.0 253.0 253.0 196.0 99.0 12.0 0.0 0.0 61.0 59.0 187.0 215.0 251.0 175.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 124.0 252.0 253.0 253.0 253.0 250.0 249.0 249.0 252.0 252.0 253.0 253.0 253.0 158.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 117.0 194.0 253.0 253.0 253.0 253.0 253.0 235.0 199.0 253.0 253.0 170.0 47.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 26.0 148.0 125.0 15.0 15.0 12.0 6.0 54.0 253.0 184.0 39.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 12.0 177.0 253.0 72.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 139.0 237.0 253.0 72.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 194.0 253.0 232.0 24.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 203.0 186.0 133.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 249.0 167.0 92.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 130.0 12.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 128.0 128.0 128.0 255.0 128.0 255.0 191.0 128.0 64.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 255.0 255.0 191.0 255.0 255.0 255.0 255.0 255.0 255.0 255.0 64.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 255.0 255.0 255.0 255.0 255.0 255.0 255.0 255.0 255.0 255.0 255.0 64.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 128.0 128.0 128.0 128.0 64.0 0.0 128.0 191.0 255.0 255.0 255.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 255.0 255.0 255.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 128.0 128.0 191.0 255.0 255.0 255.0 64.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 255.0 255.0 255.0 255.0 255.0 255.0 191.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 255.0 255.0 255.0 255.0 255.0 255.0 191.0 64.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 255.0 255.0 255.0 255.0 255.0 255.0 255.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 255.0 255.0 255.0 255.0 255.0 255.0 255.0 191.0 64.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 191.0 255.0 255.0 255.0 255.0 255.0 255.0 255.0 255.0 191.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 128.0 128.0 128.0 128.0 255.0 255.0 255.0 255.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 255.0 255.0 255.0 191.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 255.0 255.0 255.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 0.0 0.0 0.0 0.0 255.0 255.0 255.0 255.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 255.0 191.0 0.0 64.0 255.0 255.0 255.0 255.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 191.0 255.0 255.0 191.0 255.0 255.0 255.0 255.0 255.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 255.0 255.0 255.0 255.0 255.0 255.0 255.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 255.0 255.0 255.0 255.0 255.0 255.0 64.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 191.0 255.0 255.0 255.0 128.0 64.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 14.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 111.0 217.0 232.0 132.0 57.0 92.0 92.0 92.0 92.0 43.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 159.0 252.0 254.0 254.0 254.0 252.0 254.0 254.0 254.0 254.0 251.0 137.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 37.0 205.0 254.0 254.0 254.0 254.0 254.0 234.0 200.0 133.0 133.0 197.0 242.0 254.0 178.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 32.0 224.0 254.0 224.0 200.0 124.0 138.0 200.0 32.0 0.0 0.0 0.0 0.0 38.0 180.0 254.0 129.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 17.0 223.0 254.0 239.0 33.0 4.0 0.0 0.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 8.0 235.0 240.0 113.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 119.0 254.0 249.0 67.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 84.0 254.0 254.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 63.0 254.0 254.0 98.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 68.0 254.0 254.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 208.0 254.0 236.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 68.0 254.0 254.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 252.0 117.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 73.0 254.0 248.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 244.0 46.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 254.0 194.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 254.0 67.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 247.0 254.0 141.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 254.0 74.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 76.0 222.0 254.0 232.0 36.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 163.0 254.0 254.0 95.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 40.0 113.0 192.0 254.0 254.0 207.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 30.0 222.0 254.0 248.0 185.0 134.0 99.0 62.0 134.0 134.0 134.0 200.0 243.0 254.0 254.0 233.0 139.0 9.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 28.0 162.0 252.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 248.0 126.0 27.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 55.0 172.0 186.0 186.0 212.0 186.0 186.0 186.0 122.0 91.0 53.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 16.0 13.0 13.0 44.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 222.0 251.0 251.0 251.0 229.0 244.0 251.0 251.0 252.0 207.0 208.0 241.0 234.0 183.0 128.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 181.0 253.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 249.0 183.0 160.0 100.0 24.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 12.0 13.0 13.0 13.0 13.0 13.0 13.0 88.0 99.0 141.0 115.0 138.0 239.0 254.0 254.0 254.0 254.0 255.0 106.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 13.0 54.0 168.0 237.0 254.0 254.0 249.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 54.0 237.0 254.0 254.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 27.0 223.0 254.0 176.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 146.0 255.0 254.0 105.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 42.0 222.0 254.0 159.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 26.0 223.0 254.0 238.0 65.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 27.0 210.0 254.0 253.0 77.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 191.0 254.0 252.0 92.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 139.0 254.0 254.0 187.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 75.0 243.0 254.0 190.0 14.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 24.0 228.0 254.0 229.0 35.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 24.0 208.0 254.0 254.0 56.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 195.0 254.0 254.0 135.0 15.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 110.0 254.0 254.0 165.0 15.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 193.0 254.0 178.0 31.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 43.0 68.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 86.0 254.0 254.0 254.0 254.0 135.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 90.0 250.0 253.0 253.0 253.0 253.0 252.0 248.0 160.0 118.0 45.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 216.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 232.0 103.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 144.0 251.0 253.0 253.0 224.0 48.0 49.0 170.0 253.0 253.0 253.0 253.0 234.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 95.0 251.0 253.0 253.0 182.0 18.0 0.0 0.0 6.0 49.0 170.0 253.0 253.0 251.0 149.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 88.0 225.0 253.0 253.0 253.0 61.0 0.0 0.0 0.0 0.0 0.0 26.0 221.0 253.0 253.0 245.0 42.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 40.0 245.0 253.0 253.0 253.0 137.0 7.0 0.0 0.0 0.0 0.0 0.0 0.0 42.0 221.0 253.0 253.0 117.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 118.0 253.0 253.0 253.0 225.0 27.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 156.0 253.0 253.0 117.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 118.0 253.0 253.0 253.0 58.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 156.0 253.0 253.0 117.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 151.0 253.0 253.0 177.0 8.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 156.0 253.0 253.0 217.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 248.0 253.0 253.0 58.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 156.0 253.0 253.0 247.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 154.0 253.0 253.0 120.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 156.0 253.0 253.0 220.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 208.0 253.0 253.0 155.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 174.0 253.0 253.0 117.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 160.0 253.0 253.0 155.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 7.0 134.0 253.0 253.0 253.0 117.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 118.0 253.0 253.0 155.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 67.0 253.0 253.0 253.0 252.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 45.0 246.0 253.0 216.0 33.0 0.0 0.0 0.0 0.0 7.0 27.0 134.0 253.0 253.0 253.0 251.0 148.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 241.0 253.0 253.0 216.0 40.0 128.0 150.0 150.0 174.0 253.0 253.0 253.0 253.0 251.0 215.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 105.0 243.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 153.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 229.0 253.0 253.0 253.0 250.0 253.0 253.0 221.0 210.0 156.0 183.0 117.0 45.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 161.0 139.0 234.0 83.0 123.0 123.0 95.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 47.0 136.0 241.0 254.0 254.0 254.0 254.0 254.0 255.0 202.0 130.0 8.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 33.0 228.0 253.0 253.0 253.0 253.0 231.0 135.0 191.0 218.0 234.0 253.0 195.0 54.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 43.0 240.0 253.0 253.0 252.0 189.0 31.0 0.0 0.0 0.0 37.0 145.0 253.0 178.0 15.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 82.0 182.0 182.0 68.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 141.0 253.0 158.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 182.0 241.0 85.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 117.0 253.0 170.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 48.0 253.0 170.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 48.0 253.0 170.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 123.0 253.0 170.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 166.0 253.0 88.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 10.0 192.0 203.0 12.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 114.0 253.0 188.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 12.0 253.0 253.0 81.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 54.0 130.0 17.0 6.0 0.0 0.0 0.0 0.0 6.0 189.0 253.0 146.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 32.0 177.0 253.0 253.0 253.0 194.0 148.0 121.0 7.0 0.0 127.0 253.0 236.0 37.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 24.0 184.0 253.0 215.0 102.0 201.0 210.0 253.0 253.0 186.0 166.0 246.0 251.0 127.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 36.0 253.0 202.0 13.0 0.0 0.0 7.0 90.0 234.0 253.0 253.0 253.0 241.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 36.0 253.0 239.0 105.0 10.0 0.0 47.0 157.0 238.0 253.0 253.0 253.0 251.0 132.0 29.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 22.0 174.0 253.0 253.0 223.0 219.0 238.0 253.0 253.0 223.0 54.0 88.0 251.0 253.0 134.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 50.0 232.0 253.0 253.0 253.0 234.0 108.0 12.0 0.0 0.0 83.0 253.0 250.0 121.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 45.0 154.0 208.0 248.0 230.0 254.0 255.0 138.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 40.0 205.0 254.0 254.0 254.0 254.0 254.0 254.0 213.0 31.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 17.0 210.0 254.0 254.0 254.0 254.0 236.0 254.0 254.0 254.0 125.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 98.0 254.0 254.0 254.0 152.0 40.0 26.0 151.0 254.0 254.0 168.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 166.0 254.0 254.0 202.0 44.0 0.0 10.0 207.0 254.0 254.0 205.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 53.0 252.0 254.0 242.0 83.0 136.0 180.0 254.0 254.0 254.0 125.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 189.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 63.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 56.0 209.0 254.0 254.0 254.0 254.0 254.0 201.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 88.0 228.0 254.0 254.0 254.0 238.0 92.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 103.0 248.0 254.0 254.0 254.0 61.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 91.0 248.0 254.0 254.0 253.0 166.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 100.0 230.0 254.0 254.0 170.0 113.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 95.0 253.0 254.0 254.0 229.0 16.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 95.0 227.0 254.0 254.0 254.0 133.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 38.0 228.0 254.0 254.0 254.0 202.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 193.0 254.0 254.0 254.0 202.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 91.0 246.0 254.0 254.0 242.0 90.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 35.0 242.0 254.0 254.0 254.0 141.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 214.0 254.0 254.0 185.0 23.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 183.0 254.0 247.0 24.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 23.0 219.0 255.0 105.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 42.0 253.0 253.0 158.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 67.0 253.0 253.0 158.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 160.0 253.0 253.0 158.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 160.0 253.0 253.0 158.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 160.0 253.0 253.0 158.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 160.0 253.0 253.0 158.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 160.0 253.0 253.0 158.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 86.0 253.0 253.0 218.0 15.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 42.0 253.0 253.0 253.0 23.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 42.0 253.0 253.0 253.0 23.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 42.0 253.0 253.0 253.0 23.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 42.0 253.0 253.0 253.0 23.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 42.0 253.0 253.0 205.0 11.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 42.0 253.0 253.0 158.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 253.0 253.0 158.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 12.0 203.0 253.0 253.0 74.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 160.0 253.0 192.0 9.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 241.0 253.0 176.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 111.0 170.0 149.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 38.0 226.0 214.0 19.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 14.0 25.0 25.0 19.0 0.0 0.0 0.0 11.0 25.0 13.0 25.0 25.0 48.0 223.0 253.0 245.0 32.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 145.0 253.0 253.0 230.0 65.0 135.0 157.0 199.0 253.0 209.0 253.0 253.0 253.0 253.0 253.0 151.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 118.0 212.0 221.0 205.0 219.0 230.0 253.0 253.0 253.0 254.0 253.0 253.0 253.0 253.0 181.0 16.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 24.0 0.0 21.0 38.0 72.0 72.0 72.0 72.0 72.0 184.0 253.0 239.0 46.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 7.0 185.0 253.0 101.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 124.0 253.0 253.0 72.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 145.0 253.0 235.0 45.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 95.0 110.0 110.0 110.0 192.0 253.0 249.0 143.0 110.0 110.0 167.0 63.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 82.0 252.0 253.0 253.0 254.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 87.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 105.0 231.0 242.0 244.0 254.0 254.0 246.0 184.0 149.0 81.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 13.0 253.0 250.0 76.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 13.0 253.0 217.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 94.0 253.0 217.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 133.0 253.0 217.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 226.0 253.0 182.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 253.0 96.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 253.0 96.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 253.0 96.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 81.0 242.0 51.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 54.0 175.0 230.0 254.0 132.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 66.0 236.0 209.0 245.0 254.0 242.0 59.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 41.0 236.0 206.0 53.0 33.0 147.0 254.0 150.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 181.0 218.0 8.0 0.0 0.0 32.0 242.0 113.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 72.0 105.0 2.0 0.0 0.0 32.0 236.0 75.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 16.0 160.0 222.0 80.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 10.0 215.0 254.0 151.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 62.0 217.0 254.0 173.0 24.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 8.0 143.0 250.0 254.0 245.0 44.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 131.0 254.0 254.0 254.0 254.0 192.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 45.0 224.0 239.0 164.0 229.0 151.0 175.0 126.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 28.0 228.0 254.0 170.0 45.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 9.0 148.0 254.0 134.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 8.0 220.0 179.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 184.0 239.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 254.0 154.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 35.0 10.0 0.0 0.0 0.0 0.0 0.0 4.0 87.0 207.0 254.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 12.0 162.0 120.0 0.0 0.0 0.0 0.0 3.0 148.0 254.0 254.0 174.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 28.0 245.0 208.0 36.0 12.0 24.0 89.0 225.0 254.0 254.0 198.0 17.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 189.0 255.0 247.0 241.0 244.0 254.0 255.0 234.0 80.0 7.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 37.0 128.0 140.0 140.0 140.0 58.0 16.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 47.0 118.0 194.0 253.0 253.0 253.0 253.0 253.0 253.0 215.0 80.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 102.0 198.0 253.0 229.0 155.0 33.0 20.0 20.0 42.0 124.0 251.0 247.0 162.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 63.0 236.0 243.0 105.0 6.0 0.0 0.0 0.0 0.0 0.0 0.0 105.0 253.0 244.0 51.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 242.0 253.0 126.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 199.0 253.0 72.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 253.0 114.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 192.0 253.0 72.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 103.0 64.0 19.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 35.0 244.0 227.0 12.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 127.0 253.0 137.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 120.0 253.0 142.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 69.0 253.0 213.0 27.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 120.0 230.0 183.0 28.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 22.0 160.0 250.0 180.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 194.0 253.0 207.0 79.0 16.0 32.0 0.0 0.0 0.0 0.0 0.0 0.0 18.0 47.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 13.0 154.0 250.0 253.0 253.0 253.0 233.0 235.0 223.0 228.0 228.0 228.0 201.0 129.0 234.0 243.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 69.0 253.0 130.0 83.0 83.0 83.0 83.0 69.0 141.0 143.0 154.0 91.0 214.0 143.0 229.0 253.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 36.0 19.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 15.0 0.0 23.0 36.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 70.0 202.0 255.0 126.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 72.0 239.0 253.0 253.0 253.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 17.0 242.0 253.0 193.0 166.0 253.0 13.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 52.0 202.0 253.0 180.0 7.0 60.0 253.0 119.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 72.0 211.0 248.0 103.0 14.0 0.0 60.0 253.0 153.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 66.0 244.0 250.0 134.0 0.0 9.0 123.0 233.0 253.0 175.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 16.0 232.0 253.0 146.0 52.0 157.0 233.0 253.0 253.0 253.0 52.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 54.0 245.0 253.0 208.0 249.0 253.0 253.0 253.0 253.0 220.0 7.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 220.0 253.0 253.0 240.0 253.0 253.0 252.0 186.0 13.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 43.0 92.0 92.0 47.0 253.0 253.0 139.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 164.0 253.0 141.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 82.0 252.0 253.0 54.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 158.0 253.0 217.0 18.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 40.0 242.0 247.0 77.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 153.0 253.0 226.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 8.0 223.0 253.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 253.0 253.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 118.0 253.0 253.0 58.0 118.0 54.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 43.0 253.0 253.0 253.0 238.0 39.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 171.0 253.0 200.0 68.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 32.0 118.0 207.0 254.0 254.0 254.0 255.0 254.0 138.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 74.0 116.0 234.0 234.0 234.0 234.0 239.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 228.0 37.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 29.0 191.0 244.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 96.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 97.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 222.0 23.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 84.0 248.0 253.0 253.0 253.0 253.0 253.0 253.0 244.0 219.0 219.0 145.0 253.0 253.0 253.0 253.0 212.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 86.0 131.0 221.0 103.0 103.0 103.0 103.0 75.0 0.0 0.0 15.0 253.0 253.0 253.0 253.0 212.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 86.0 200.0 253.0 253.0 253.0 253.0 141.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 203.0 253.0 253.0 253.0 253.0 133.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 25.0 195.0 253.0 253.0 253.0 253.0 253.0 54.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 25.0 194.0 253.0 253.0 253.0 253.0 225.0 139.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 190.0 253.0 253.0 253.0 253.0 230.0 47.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 87.0 244.0 253.0 253.0 253.0 249.0 46.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 8.0 144.0 251.0 253.0 253.0 253.0 249.0 165.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 82.0 253.0 253.0 253.0 253.0 253.0 89.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 89.0 248.0 253.0 253.0 253.0 253.0 151.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 93.0 243.0 253.0 253.0 253.0 253.0 193.0 9.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 192.0 253.0 253.0 253.0 253.0 231.0 65.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 87.0 240.0 253.0 253.0 253.0 212.0 26.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 161.0 253.0 253.0 253.0 78.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 16.0 124.0 253.0 119.0 12.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 123.0 174.0 51.0 14.0 0.0 8.0 78.0 236.0 49.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 253.0 252.0 252.0 211.0 190.0 201.0 252.0 252.0 163.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 253.0 252.0 252.0 252.0 252.0 253.0 252.0 252.0 247.0 38.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 71.0 253.0 252.0 98.0 154.0 215.0 253.0 252.0 252.0 252.0 42.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 106.0 253.0 252.0 21.0 0.0 18.0 42.0 42.0 236.0 252.0 42.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 107.0 255.0 253.0 21.0 0.0 0.0 0.0 0.0 233.0 253.0 60.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 106.0 253.0 252.0 21.0 0.0 0.0 0.0 0.0 232.0 252.0 147.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 106.0 253.0 252.0 21.0 0.0 0.0 0.0 0.0 232.0 252.0 147.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 80.0 227.0 252.0 21.0 0.0 0.0 0.0 0.0 232.0 252.0 147.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 42.0 147.0 12.0 0.0 0.0 0.0 0.0 232.0 252.0 147.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 233.0 253.0 147.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 232.0 252.0 147.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 232.0 252.0 147.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 232.0 252.0 147.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 232.0 252.0 147.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 233.0 253.0 209.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 232.0 252.0 252.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 232.0 252.0 252.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 232.0 252.0 252.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 47.0 217.0 164.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 79.0 168.0 140.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 82.0 198.0 243.0 254.0 254.0 15.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 88.0 253.0 254.0 254.0 254.0 254.0 15.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 50.0 254.0 254.0 254.0 254.0 207.0 134.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 8.0 176.0 254.0 254.0 238.0 105.0 9.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 145.0 255.0 254.0 251.0 30.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 19.0 214.0 254.0 225.0 47.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 199.0 254.0 251.0 103.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 235.0 255.0 151.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 235.0 254.0 134.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 67.0 251.0 226.0 40.0 0.0 0.0 0.0 0.0 17.0 100.0 197.0 171.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 70.0 251.0 181.0 0.0 0.0 0.0 0.0 75.0 249.0 254.0 254.0 254.0 103.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 235.0 181.0 0.0 0.0 0.0 19.0 221.0 254.0 254.0 254.0 254.0 234.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 235.0 181.0 0.0 0.0 0.0 108.0 254.0 254.0 244.0 167.0 216.0 234.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 235.0 204.0 10.0 0.0 2.0 186.0 254.0 242.0 73.0 10.0 205.0 234.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 226.0 255.0 134.0 8.0 6.0 254.0 254.0 119.0 0.0 92.0 254.0 174.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 103.0 254.0 254.0 175.0 72.0 254.0 254.0 147.0 105.0 250.0 254.0 26.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 181.0 253.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 183.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 134.0 254.0 254.0 254.0 254.0 254.0 234.0 184.0 27.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 72.0 238.0 233.0 150.0 133.0 30.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 18.0 18.0 55.0 137.0 192.0 131.0 8.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 16.0 95.0 164.0 254.0 254.0 254.0 254.0 254.0 254.0 178.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 41.0 151.0 207.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 225.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 190.0 254.0 254.0 254.0 254.0 209.0 155.0 65.0 65.0 148.0 254.0 247.0 66.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 69.0 238.0 254.0 166.0 47.0 18.0 0.0 0.0 0.0 114.0 254.0 254.0 89.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 24.0 29.0 2.0 0.0 0.0 0.0 0.0 0.0 114.0 254.0 254.0 89.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 8.0 250.0 254.0 89.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 114.0 254.0 254.0 89.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 188.0 254.0 250.0 74.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 67.0 248.0 254.0 225.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 187.0 254.0 251.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 29.0 229.0 254.0 243.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 27.0 211.0 254.0 254.0 243.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 46.0 228.0 250.0 250.0 250.0 250.0 251.0 254.0 254.0 254.0 65.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 68.0 254.0 254.0 254.0 254.0 254.0 254.0 255.0 254.0 254.0 254.0 145.0 27.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 46.0 226.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 244.0 80.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 154.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 239.0 98.0 170.0 218.0 254.0 254.0 241.0 154.0 14.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 154.0 254.0 254.0 254.0 254.0 254.0 254.0 182.0 41.0 0.0 0.0 24.0 114.0 220.0 254.0 254.0 174.0 12.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 154.0 254.0 254.0 254.0 254.0 252.0 87.0 13.0 0.0 0.0 0.0 0.0 0.0 21.0 57.0 179.0 254.0 82.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 27.0 216.0 254.0 254.0 149.0 22.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 35.0 135.0 82.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 91.0 188.0 64.0 39.0 30.0 0.0 17.0 0.0 17.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 196.0 254.0 254.0 254.0 240.0 185.0 215.0 185.0 215.0 185.0 185.0 31.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 120.0 254.0 213.0 240.0 226.0 180.0 249.0 249.0 249.0 254.0 254.0 137.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 185.0 254.0 59.0 0.0 0.0 0.0 0.0 0.0 0.0 245.0 254.0 151.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 62.0 248.0 183.0 15.0 0.0 0.0 0.0 0.0 0.0 74.0 252.0 254.0 70.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 209.0 249.0 52.0 0.0 0.0 0.0 0.0 0.0 0.0 99.0 254.0 254.0 43.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 91.0 254.0 176.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 120.0 254.0 242.0 35.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 94.0 43.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 207.0 254.0 189.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 207.0 254.0 182.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 207.0 254.0 81.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 207.0 254.0 81.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 207.0 254.0 81.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 15.0 218.0 248.0 62.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 60.0 254.0 227.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 164.0 254.0 227.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 168.0 254.0 227.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 168.0 254.0 227.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 13.0 216.0 254.0 167.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 22.0 254.0 254.0 119.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 181.0 213.0 22.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 75.0 0.0 98.0 185.0 178.0 94.0 19.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 15.0 111.0 195.0 238.0 94.0 0.0 208.0 249.0 254.0 254.0 116.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 20.0 50.0 107.0 197.0 246.0 183.0 25.0 0.0 0.0 81.0 245.0 254.0 249.0 91.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 18.0 84.0 230.0 254.0 254.0 221.0 86.0 0.0 0.0 1.0 125.0 253.0 254.0 178.0 53.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 133.0 254.0 254.0 217.0 118.0 4.0 0.0 0.0 62.0 202.0 254.0 241.0 131.0 8.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 107.0 244.0 254.0 213.0 45.0 0.0 0.0 0.0 62.0 240.0 254.0 220.0 29.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 44.0 246.0 254.0 209.0 49.0 0.0 0.0 0.0 31.0 241.0 254.0 221.0 27.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 95.0 254.0 254.0 55.0 0.0 0.0 0.0 17.0 198.0 254.0 218.0 28.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 27.0 219.0 254.0 233.0 144.0 39.0 42.0 204.0 254.0 205.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 115.0 248.0 254.0 254.0 244.0 233.0 254.0 223.0 24.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 38.0 84.0 168.0 245.0 254.0 254.0 254.0 207.0 115.0 9.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 14.0 236.0 254.0 230.0 163.0 237.0 244.0 211.0 80.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 99.0 254.0 254.0 99.0 0.0 0.0 37.0 225.0 254.0 130.0 8.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 71.0 254.0 229.0 12.0 0.0 0.0 0.0 2.0 170.0 254.0 51.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 96.0 254.0 254.0 18.0 0.0 0.0 0.0 0.0 81.0 254.0 198.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 80.0 254.0 254.0 18.0 0.0 0.0 0.0 0.0 131.0 254.0 119.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 214.0 254.0 78.0 0.0 0.0 0.0 1.0 183.0 244.0 63.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 253.0 223.0 24.0 0.0 2.0 126.0 254.0 178.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 87.0 238.0 222.0 119.0 177.0 254.0 217.0 27.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 18.0 154.0 196.0 196.0 101.0 25.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 67.0 254.0 214.0 25.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 61.0 227.0 35.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 188.0 253.0 253.0 165.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 182.0 253.0 180.0 30.0 0.0 0.0 0.0 0.0 0.0 0.0 49.0 253.0 253.0 253.0 253.0 24.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 37.0 253.0 253.0 253.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 72.0 253.0 253.0 253.0 188.0 8.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 37.0 253.0 253.0 253.0 168.0 0.0 0.0 0.0 0.0 0.0 0.0 169.0 253.0 253.0 233.0 62.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 72.0 253.0 253.0 253.0 168.0 0.0 0.0 0.0 0.0 0.0 11.0 194.0 253.0 253.0 168.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 157.0 253.0 253.0 253.0 168.0 0.0 0.0 41.0 51.0 136.0 167.0 253.0 253.0 253.0 168.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 157.0 253.0 253.0 253.0 201.0 143.0 160.0 235.0 238.0 253.0 253.0 253.0 253.0 253.0 123.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 157.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 254.0 253.0 253.0 253.0 253.0 187.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 157.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 254.0 253.0 253.0 253.0 253.0 180.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 24.0 250.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 249.0 249.0 254.0 255.0 254.0 118.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 85.0 234.0 253.0 253.0 253.0 253.0 231.0 171.0 52.0 145.0 253.0 253.0 253.0 72.0 20.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 19.0 183.0 217.0 176.0 96.0 9.0 0.0 0.0 71.0 253.0 253.0 253.0 226.0 223.0 31.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 25.0 253.0 253.0 253.0 253.0 145.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 112.0 253.0 253.0 253.0 172.0 14.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 10.0 228.0 253.0 253.0 236.0 43.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 53.0 253.0 253.0 253.0 152.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 88.0 253.0 253.0 211.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 13.0 253.0 253.0 205.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 7.0 202.0 253.0 147.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 37.0 125.0 170.0 152.0 255.0 174.0 194.0 101.0 101.0 12.0 68.0 101.0 15.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 93.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 206.0 236.0 253.0 170.0 17.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 93.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 92.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 30.0 211.0 165.0 172.0 253.0 196.0 253.0 253.0 253.0 253.0 253.0 253.0 92.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 34.0 4.0 8.0 61.0 24.0 61.0 154.0 253.0 253.0 253.0 206.0 22.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 124.0 253.0 253.0 253.0 191.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 22.0 246.0 253.0 253.0 214.0 34.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 136.0 253.0 253.0 253.0 137.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 41.0 216.0 253.0 253.0 245.0 67.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 218.0 253.0 253.0 253.0 97.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 104.0 246.0 253.0 253.0 204.0 25.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 107.0 253.0 253.0 253.0 253.0 109.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 185.0 253.0 253.0 247.0 109.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 185.0 253.0 253.0 230.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 185.0 253.0 253.0 230.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 73.0 243.0 253.0 253.0 192.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 90.0 253.0 253.0 251.0 74.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 173.0 253.0 253.0 176.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 67.0 238.0 253.0 49.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 185.0 253.0 22.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 68.0 156.0 253.0 253.0 255.0 253.0 253.0 253.0 165.0 18.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 112.0 237.0 252.0 252.0 252.0 253.0 252.0 252.0 252.0 252.0 106.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 135.0 231.0 231.0 160.0 38.0 21.0 21.0 40.0 252.0 252.0 106.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 48.0 252.0 252.0 106.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 36.0 223.0 252.0 208.0 18.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 25.0 157.0 253.0 243.0 35.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 36.0 183.0 252.0 252.0 237.0 102.0 36.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 20.0 127.0 223.0 253.0 252.0 252.0 252.0 252.0 242.0 153.0 19.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 153.0 252.0 252.0 216.0 153.0 84.0 154.0 215.0 253.0 252.0 202.0 21.0 0.0 0.0 0.0 0.0 43.0 11.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 100.0 252.0 164.0 18.0 0.0 0.0 0.0 18.0 122.0 252.0 252.0 225.0 35.0 0.0 0.0 107.0 141.0 7.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 36.0 224.0 253.0 122.0 105.0 227.0 223.0 35.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 92.0 252.0 252.0 253.0 189.0 32.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 8.0 85.0 252.0 252.0 161.0 14.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 55.0 197.0 252.0 252.0 252.0 106.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 89.0 236.0 252.0 252.0 252.0 252.0 18.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 69.0 236.0 212.0 76.0 245.0 253.0 191.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 101.0 252.0 217.0 41.0 185.0 252.0 252.0 68.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 43.0 234.0 252.0 112.0 192.0 252.0 251.0 134.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 85.0 252.0 252.0 252.0 253.0 252.0 134.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 85.0 252.0 252.0 252.0 191.0 112.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 45.0 174.0 254.0 93.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 199.0 253.0 253.0 253.0 11.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 79.0 253.0 200.0 96.0 206.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 33.0 230.0 253.0 168.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 78.0 253.0 236.0 71.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 169.0 253.0 146.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 30.0 238.0 253.0 60.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 37.0 253.0 253.0 60.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 146.0 253.0 253.0 60.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 157.0 253.0 253.0 60.0 0.0 0.0 0.0 0.0 0.0 0.0 76.0 202.0 155.0 29.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 158.0 254.0 254.0 60.0 0.0 0.0 0.0 0.0 1.0 82.0 209.0 254.0 254.0 220.0 31.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 157.0 253.0 253.0 60.0 0.0 0.0 0.0 0.0 82.0 253.0 253.0 253.0 253.0 253.0 217.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 140.0 253.0 253.0 60.0 0.0 0.0 0.0 18.0 209.0 253.0 231.0 136.0 96.0 216.0 253.0 111.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 37.0 253.0 253.0 60.0 0.0 0.0 0.0 144.0 254.0 214.0 32.0 0.0 0.0 194.0 253.0 156.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 28.0 233.0 253.0 89.0 0.0 0.0 165.0 250.0 246.0 31.0 0.0 0.0 0.0 194.0 253.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 135.0 253.0 236.0 72.0 28.0 237.0 253.0 116.0 0.0 0.0 14.0 102.0 239.0 188.0 9.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 33.0 229.0 253.0 237.0 224.0 253.0 253.0 0.0 0.0 53.0 175.0 253.0 253.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 55.0 231.0 253.0 253.0 253.0 253.0 213.0 166.0 240.0 253.0 253.0 144.0 7.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 111.0 233.0 253.0 253.0 253.0 254.0 253.0 253.0 232.0 116.0 6.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 9.0 116.0 132.0 248.0 254.0 242.0 132.0 49.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 119.0 254.0 215.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 118.0 253.0 213.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 118.0 253.0 213.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 10.0 138.0 253.0 213.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 134.0 253.0 253.0 213.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 253.0 253.0 93.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 167.0 255.0 253.0 103.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 43.0 213.0 254.0 216.0 53.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 43.0 200.0 253.0 254.0 135.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 79.0 253.0 253.0 254.0 135.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 20.0 254.0 254.0 254.0 243.0 105.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 171.0 253.0 253.0 223.0 63.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 79.0 253.0 253.0 254.0 135.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 19.0 240.0 253.0 253.0 200.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 96.0 253.0 253.0 253.0 121.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 215.0 253.0 253.0 253.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 133.0 247.0 253.0 253.0 237.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 156.0 253.0 253.0 253.0 57.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 156.0 253.0 253.0 253.0 57.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 36.0 73.0 192.0 57.0 13.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 115.0 196.0 254.0 254.0 254.0 156.0 17.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 65.0 203.0 253.0 253.0 251.0 248.0 253.0 253.0 159.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 8.0 137.0 249.0 253.0 241.0 147.0 68.0 41.0 117.0 246.0 253.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 109.0 253.0 242.0 157.0 29.0 0.0 0.0 2.0 115.0 250.0 247.0 18.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 22.0 145.0 36.0 0.0 0.0 0.0 0.0 45.0 253.0 253.0 106.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 111.0 153.0 240.0 253.0 219.0 7.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 84.0 253.0 253.0 253.0 230.0 47.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 148.0 239.0 248.0 253.0 253.0 253.0 250.0 99.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 239.0 253.0 253.0 252.0 181.0 253.0 253.0 248.0 95.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 44.0 4.0 4.0 1.0 50.0 184.0 253.0 252.0 78.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 14.0 228.0 253.0 121.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 126.0 253.0 219.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 130.0 253.0 213.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 108.0 93.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 224.0 253.0 120.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 32.0 236.0 167.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 120.0 250.0 253.0 70.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 65.0 253.0 178.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 47.0 253.0 253.0 165.0 6.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 31.0 235.0 178.0 0.0 0.0 0.0 0.0 0.0 17.0 158.0 243.0 253.0 203.0 6.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 219.0 235.0 138.0 90.0 90.0 91.0 149.0 216.0 253.0 248.0 163.0 19.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 162.0 253.0 253.0 253.0 253.0 254.0 253.0 235.0 146.0 24.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 26.0 123.0 165.0 253.0 198.0 153.0 134.0 32.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 14.0 141.0 224.0 79.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 186.0 253.0 253.0 117.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 99.0 254.0 171.0 115.0 36.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 52.0 248.0 244.0 40.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 31.0 219.0 253.0 45.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 119.0 254.0 171.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 103.0 253.0 212.0 9.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 19.0 196.0 228.0 43.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 149.0 253.0 174.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 194.0 253.0 100.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 23.0 255.0 174.0 0.0 0.0 0.0 0.0 50.0 97.0 59.0 14.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 180.0 254.0 135.0 0.0 0.0 53.0 215.0 247.0 253.0 253.0 185.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 195.0 254.0 135.0 0.0 88.0 235.0 254.0 216.0 107.0 172.0 253.0 68.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 195.0 254.0 135.0 88.0 251.0 253.0 154.0 25.0 0.0 136.0 253.0 173.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 195.0 254.0 150.0 235.0 237.0 118.0 0.0 0.0 0.0 136.0 253.0 98.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 99.0 255.0 254.0 254.0 154.0 0.0 0.0 0.0 0.0 137.0 254.0 23.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 15.0 208.0 253.0 253.0 124.0 0.0 13.0 20.0 20.0 183.0 245.0 53.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 127.0 253.0 253.0 241.0 175.0 224.0 253.0 253.0 253.0 126.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 110.0 241.0 253.0 253.0 254.0 253.0 253.0 216.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 41.0 163.0 253.0 254.0 253.0 222.0 94.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 116.0 243.0 224.0 246.0 59.0 0.0 31.0 121.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 149.0 191.0 95.0 8.0 158.0 25.0 17.0 219.0 228.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 14.0 173.0 149.0 56.0 0.0 0.0 61.0 5.0 198.0 228.0 44.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 86.0 200.0 25.0 0.0 0.0 0.0 0.0 66.0 203.0 75.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 125.0 138.0 0.0 0.0 0.0 0.0 43.0 243.0 230.0 46.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 139.0 201.0 6.0 0.0 0.0 0.0 0.0 149.0 252.0 84.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 88.0 228.0 10.0 0.0 0.0 0.0 18.0 152.0 253.0 139.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 225.0 96.0 0.0 0.0 2.0 68.0 194.0 224.0 110.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 49.0 229.0 20.0 28.0 60.0 151.0 255.0 249.0 71.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 41.0 249.0 206.0 253.0 221.0 206.0 246.0 202.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 106.0 196.0 123.0 16.0 135.0 246.0 142.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 110.0 254.0 198.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 29.0 250.0 237.0 25.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 219.0 210.0 24.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 112.0 244.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 244.0 124.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 94.0 233.0 164.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 211.0 222.0 9.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 211.0 125.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 24.0 90.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 110.0 125.0 125.0 125.0 158.0 158.0 125.0 38.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 157.0 254.0 254.0 254.0 254.0 255.0 254.0 254.0 251.0 83.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 172.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 247.0 144.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 8.0 104.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 222.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 10.0 25.0 133.0 184.0 254.0 254.0 254.0 254.0 254.0 222.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 184.0 232.0 254.0 254.0 254.0 254.0 254.0 222.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 117.0 248.0 254.0 254.0 254.0 254.0 254.0 254.0 111.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 216.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 131.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 88.0 242.0 254.0 254.0 254.0 254.0 254.0 254.0 222.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 89.0 241.0 254.0 205.0 236.0 254.0 254.0 230.0 26.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 52.0 65.0 17.0 153.0 254.0 254.0 254.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 53.0 254.0 254.0 254.0 228.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 77.0 254.0 254.0 254.0 137.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 40.0 231.0 254.0 254.0 254.0 98.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 17.0 0.0 0.0 0.0 9.0 152.0 254.0 254.0 254.0 233.0 35.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 142.0 207.0 157.0 50.0 131.0 182.0 254.0 254.0 254.0 254.0 208.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 63.0 244.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 251.0 84.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 106.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 245.0 136.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 49.0 235.0 254.0 254.0 254.0 254.0 254.0 250.0 221.0 36.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 109.0 235.0 254.0 254.0 221.0 32.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 92.0 253.0 253.0 253.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 190.0 251.0 251.0 251.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 190.0 251.0 251.0 251.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 190.0 251.0 251.0 251.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 190.0 251.0 251.0 251.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 191.0 253.0 253.0 253.0 195.0 24.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 190.0 251.0 251.0 251.0 253.0 62.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 190.0 251.0 251.0 251.0 253.0 141.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 51.0 251.0 251.0 251.0 253.0 220.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 32.0 251.0 251.0 251.0 253.0 220.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 12.0 174.0 253.0 253.0 255.0 221.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 32.0 251.0 251.0 251.0 253.0 220.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 32.0 251.0 251.0 251.0 253.0 220.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 32.0 251.0 251.0 251.0 253.0 220.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 32.0 251.0 251.0 251.0 253.0 220.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 20.0 206.0 253.0 253.0 255.0 253.0 126.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 32.0 229.0 251.0 253.0 251.0 126.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 221.0 251.0 253.0 251.0 188.0 95.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 181.0 211.0 253.0 251.0 251.0 188.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 24.0 35.0 153.0 251.0 251.0 89.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 37.0 253.0 255.0 253.0 72.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 63.0 63.0 0.0 0.0 63.0 181.0 252.0 253.0 252.0 71.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 182.0 242.0 215.0 0.0 16.0 222.0 252.0 252.0 237.0 174.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 144.0 253.0 210.0 92.0 1.0 191.0 252.0 252.0 252.0 144.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 94.0 211.0 252.0 206.0 20.0 0.0 144.0 253.0 252.0 252.0 108.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 32.0 227.0 252.0 252.0 20.0 0.0 32.0 237.0 253.0 252.0 220.0 15.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 37.0 211.0 252.0 246.0 132.0 0.0 11.0 150.0 252.0 253.0 252.0 195.0 0.0 0.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 37.0 252.0 252.0 252.0 132.0 0.0 0.0 73.0 252.0 252.0 253.0 252.0 71.0 0.0 145.0 206.0 41.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 182.0 253.0 253.0 253.0 72.0 0.0 0.0 73.0 253.0 253.0 255.0 211.0 109.0 191.0 255.0 253.0 72.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 63.0 242.0 252.0 252.0 252.0 124.0 73.0 42.0 115.0 252.0 252.0 253.0 252.0 252.0 252.0 253.0 231.0 51.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 73.0 252.0 252.0 252.0 252.0 252.0 252.0 222.0 242.0 252.0 252.0 253.0 252.0 252.0 252.0 237.0 153.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 73.0 252.0 252.0 252.0 252.0 252.0 252.0 253.0 252.0 252.0 252.0 253.0 252.0 252.0 252.0 144.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 42.0 160.0 253.0 253.0 253.0 253.0 253.0 255.0 253.0 253.0 253.0 255.0 253.0 237.0 144.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 119.0 210.0 189.0 231.0 252.0 253.0 252.0 252.0 252.0 222.0 138.0 30.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 31.0 10.0 51.0 154.0 253.0 252.0 252.0 252.0 160.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 253.0 252.0 252.0 252.0 253.0 119.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 192.0 253.0 253.0 253.0 255.0 253.0 133.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 78.0 242.0 252.0 252.0 253.0 252.0 174.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 103.0 221.0 252.0 253.0 220.0 61.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 16.0 190.0 108.0 15.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 22.0 245.0 86.0 5.0 11.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 80.0 240.0 177.0 203.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 184.0 252.0 252.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 184.0 252.0 252.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 131.0 252.0 252.0 106.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 32.0 229.0 253.0 244.0 50.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 133.0 252.0 253.0 113.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 68.0 215.0 253.0 219.0 19.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 253.0 252.0 111.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 253.0 252.0 183.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 253.0 184.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 159.0 252.0 196.0 9.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 17.0 227.0 252.0 45.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 161.0 252.0 45.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 57.0 252.0 150.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 47.0 253.0 161.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 47.0 252.0 160.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 47.0 252.0 160.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 47.0 252.0 236.0 19.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 137.0 116.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 27.0 136.0 57.0 18.0 18.0 18.0 18.0 18.0 38.0 136.0 45.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 41.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 41.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 73.0 182.0 157.0 65.0 161.0 212.0 253.0 253.0 253.0 253.0 232.0 30.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 57.0 248.0 253.0 253.0 233.0 60.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 12.0 244.0 253.0 253.0 247.0 52.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 187.0 253.0 253.0 194.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 24.0 113.0 142.0 142.0 249.0 253.0 253.0 93.0 24.0 24.0 24.0 24.0 24.0 24.0 24.0 24.0 24.0 13.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 30.0 240.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 237.0 168.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 52.0 110.0 215.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 215.0 194.0 155.0 46.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 89.0 253.0 253.0 253.0 241.0 230.0 194.0 176.0 69.0 59.0 59.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 89.0 253.0 253.0 253.0 167.0 29.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 89.0 253.0 253.0 253.0 94.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 89.0 253.0 253.0 230.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 89.0 253.0 253.0 243.0 55.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 89.0 253.0 253.0 253.0 94.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 89.0 253.0 253.0 253.0 94.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 89.0 253.0 253.0 234.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 89.0 253.0 253.0 230.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 122.0 135.0 68.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 157.0 241.0 247.0 130.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 87.0 241.0 241.0 198.0 222.0 253.0 152.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 19.0 168.0 253.0 243.0 41.0 0.0 16.0 178.0 254.0 109.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 146.0 253.0 207.0 39.0 0.0 0.0 0.0 52.0 235.0 120.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 72.0 243.0 240.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 209.0 243.0 71.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 20.0 209.0 253.0 145.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 136.0 254.0 225.0 18.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 238.0 254.0 89.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 109.0 253.0 202.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 135.0 254.0 182.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 116.0 253.0 129.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 154.0 253.0 91.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 27.0 238.0 253.0 129.0 0.0 0.0 0.0 0.0 12.0 19.0 19.0 19.0 12.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 27.0 238.0 253.0 181.0 0.0 0.0 40.0 124.0 228.0 253.0 253.0 253.0 227.0 66.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 141.0 254.0 202.0 5.0 153.0 254.0 254.0 255.0 186.0 191.0 254.0 254.0 202.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 90.0 253.0 254.0 237.0 250.0 223.0 108.0 18.0 2.0 3.0 203.0 253.0 254.0 18.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 145.0 254.0 253.0 253.0 125.0 0.0 0.0 8.0 50.0 226.0 253.0 146.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 20.0 208.0 253.0 253.0 249.0 199.0 200.0 211.0 253.0 251.0 169.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 124.0 175.0 253.0 253.0 254.0 253.0 207.0 86.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 38.0 122.0 246.0 255.0 255.0 245.0 121.0 8.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 57.0 176.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 155.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 191.0 253.0 253.0 253.0 253.0 250.0 248.0 253.0 253.0 253.0 105.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 126.0 253.0 253.0 245.0 210.0 111.0 37.0 0.0 155.0 253.0 253.0 187.0 14.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 253.0 253.0 250.0 139.0 0.0 0.0 0.0 0.0 15.0 226.0 253.0 253.0 116.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 253.0 253.0 141.0 0.0 0.0 0.0 0.0 0.0 0.0 76.0 253.0 253.0 219.0 25.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 73.0 253.0 238.0 22.0 0.0 0.0 0.0 0.0 0.0 14.0 221.0 253.0 253.0 253.0 150.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 114.0 253.0 235.0 21.0 0.0 0.0 0.0 0.0 32.0 193.0 253.0 253.0 253.0 253.0 230.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 61.0 253.0 253.0 126.0 0.0 0.0 2.0 40.0 171.0 253.0 253.0 253.0 253.0 253.0 159.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 253.0 253.0 211.0 96.0 55.0 159.0 253.0 253.0 253.0 253.0 253.0 253.0 240.0 73.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 133.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 214.0 253.0 253.0 188.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 97.0 174.0 245.0 253.0 252.0 232.0 192.0 22.0 65.0 253.0 253.0 87.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 54.0 86.0 81.0 0.0 0.0 0.0 21.0 222.0 235.0 28.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 23.0 224.0 226.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 72.0 253.0 123.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 168.0 253.0 192.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 168.0 253.0 237.0 33.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 168.0 253.0 253.0 81.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 168.0 253.0 253.0 81.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 97.0 233.0 242.0 46.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
diff --git a/pymic/test/runs/Feb19_16-56-35_uestc-MW50-SV0/00002/default/metadata.tsv b/pymic/test/runs/Feb19_16-56-35_uestc-MW50-SV0/00002/default/metadata.tsv
deleted file mode 100644
index 3037188..0000000
--- a/pymic/test/runs/Feb19_16-56-35_uestc-MW50-SV0/00002/default/metadata.tsv
+++ /dev/null
@@ -1,201 +0,0 @@
-digit dataset
-tensor(7) test
-tensor(2) test
-tensor(1) test
-tensor(0) test
-tensor(4) test
-tensor(1) test
-tensor(4) test
-tensor(9) test
-tensor(5) test
-tensor(9) test
-tensor(0) test
-tensor(6) test
-tensor(9) test
-tensor(0) test
-tensor(1) test
-tensor(5) test
-tensor(9) test
-tensor(7) test
-tensor(3) test
-tensor(4) test
-tensor(9) test
-tensor(6) test
-tensor(6) test
-tensor(5) test
-tensor(4) test
-tensor(0) test
-tensor(7) test
-tensor(4) test
-tensor(0) test
-tensor(1) test
-tensor(3) test
-tensor(1) test
-tensor(3) test
-tensor(4) test
-tensor(7) test
-tensor(2) test
-tensor(7) test
-tensor(1) test
-tensor(2) test
-tensor(1) test
-tensor(1) test
-tensor(7) test
-tensor(4) test
-tensor(2) test
-tensor(3) test
-tensor(5) test
-tensor(1) test
-tensor(2) test
-tensor(4) test
-tensor(4) test
-tensor(6) test
-tensor(3) test
-tensor(5) test
-tensor(5) test
-tensor(6) test
-tensor(0) test
-tensor(4) test
-tensor(1) test
-tensor(9) test
-tensor(5) test
-tensor(7) test
-tensor(8) test
-tensor(9) test
-tensor(3) test
-tensor(7) test
-tensor(4) test
-tensor(6) test
-tensor(4) test
-tensor(3) test
-tensor(0) test
-tensor(7) test
-tensor(0) test
-tensor(2) test
-tensor(9) test
-tensor(1) test
-tensor(7) test
-tensor(3) test
-tensor(2) test
-tensor(9) test
-tensor(7) test
-tensor(7) test
-tensor(6) test
-tensor(2) test
-tensor(7) test
-tensor(8) test
-tensor(4) test
-tensor(7) test
-tensor(3) test
-tensor(6) test
-tensor(1) test
-tensor(3) test
-tensor(6) test
-tensor(9) test
-tensor(3) test
-tensor(1) test
-tensor(4) test
-tensor(1) test
-tensor(7) test
-tensor(6) test
-tensor(9) test
-tensor(5) train
-tensor(0) train
-tensor(4) train
-tensor(1) train
-tensor(9) train
-tensor(2) train
-tensor(1) train
-tensor(3) train
-tensor(1) train
-tensor(4) train
-tensor(3) train
-tensor(5) train
-tensor(3) train
-tensor(6) train
-tensor(1) train
-tensor(7) train
-tensor(2) train
-tensor(8) train
-tensor(6) train
-tensor(9) train
-tensor(4) train
-tensor(0) train
-tensor(9) train
-tensor(1) train
-tensor(1) train
-tensor(2) train
-tensor(4) train
-tensor(3) train
-tensor(2) train
-tensor(7) train
-tensor(3) train
-tensor(8) train
-tensor(6) train
-tensor(9) train
-tensor(0) train
-tensor(5) train
-tensor(6) train
-tensor(0) train
-tensor(7) train
-tensor(6) train
-tensor(1) train
-tensor(8) train
-tensor(7) train
-tensor(9) train
-tensor(3) train
-tensor(9) train
-tensor(8) train
-tensor(5) train
-tensor(9) train
-tensor(3) train
-tensor(3) train
-tensor(0) train
-tensor(7) train
-tensor(4) train
-tensor(9) train
-tensor(8) train
-tensor(0) train
-tensor(9) train
-tensor(4) train
-tensor(1) train
-tensor(4) train
-tensor(4) train
-tensor(6) train
-tensor(0) train
-tensor(4) train
-tensor(5) train
-tensor(6) train
-tensor(1) train
-tensor(0) train
-tensor(0) train
-tensor(1) train
-tensor(7) train
-tensor(1) train
-tensor(6) train
-tensor(3) train
-tensor(0) train
-tensor(2) train
-tensor(1) train
-tensor(1) train
-tensor(7) train
-tensor(9) train
-tensor(0) train
-tensor(2) train
-tensor(6) train
-tensor(7) train
-tensor(8) train
-tensor(3) train
-tensor(9) train
-tensor(0) train
-tensor(4) train
-tensor(6) train
-tensor(7) train
-tensor(4) train
-tensor(6) train
-tensor(8) train
-tensor(0) train
-tensor(7) train
-tensor(8) train
-tensor(3) train
-tensor(1) train
diff --git a/pymic/test/runs/Feb19_16-56-35_uestc-MW50-SV0/00002/default/sprite.png b/pymic/test/runs/Feb19_16-56-35_uestc-MW50-SV0/00002/default/sprite.png
deleted file mode 100644
index 388c0d0..0000000
Binary files a/pymic/test/runs/Feb19_16-56-35_uestc-MW50-SV0/00002/default/sprite.png and /dev/null differ
diff --git a/pymic/test/runs/Feb19_16-56-35_uestc-MW50-SV0/00002/default/tensors.tsv b/pymic/test/runs/Feb19_16-56-35_uestc-MW50-SV0/00002/default/tensors.tsv
deleted file mode 100644
index 5aa31d9..0000000
--- a/pymic/test/runs/Feb19_16-56-35_uestc-MW50-SV0/00002/default/tensors.tsv
+++ /dev/null
@@ -1,200 +0,0 @@
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 84.0 185.0 159.0 151.0 60.0 36.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 222.0 254.0 254.0 254.0 254.0 241.0 198.0 198.0 198.0 198.0 198.0 198.0 198.0 198.0 170.0 52.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 67.0 114.0 72.0 114.0 163.0 227.0 254.0 225.0 254.0 254.0 254.0 250.0 229.0 254.0 254.0 140.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 17.0 66.0 14.0 67.0 67.0 67.0 59.0 21.0 236.0 254.0 106.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 83.0 253.0 209.0 18.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 22.0 233.0 255.0 83.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 129.0 254.0 238.0 44.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 59.0 249.0 254.0 62.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 133.0 254.0 187.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 9.0 205.0 248.0 58.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 126.0 254.0 182.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 75.0 251.0 240.0 57.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 19.0 221.0 254.0 166.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 203.0 254.0 219.0 35.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 38.0 254.0 254.0 77.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 31.0 224.0 254.0 115.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 133.0 254.0 254.0 52.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 61.0 242.0 254.0 254.0 52.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 121.0 254.0 254.0 219.0 40.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 121.0 254.0 207.0 18.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 116.0 125.0 171.0 255.0 255.0 150.0 93.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 169.0 253.0 253.0 253.0 253.0 253.0 253.0 218.0 30.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 169.0 253.0 253.0 253.0 213.0 142.0 176.0 253.0 253.0 122.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 52.0 250.0 253.0 210.0 32.0 12.0 0.0 6.0 206.0 253.0 140.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 77.0 251.0 210.0 25.0 0.0 0.0 0.0 122.0 248.0 253.0 65.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 31.0 18.0 0.0 0.0 0.0 0.0 209.0 253.0 253.0 65.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 117.0 247.0 253.0 198.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 76.0 247.0 253.0 231.0 63.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 253.0 253.0 144.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 176.0 246.0 253.0 159.0 12.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 25.0 234.0 253.0 233.0 35.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 198.0 253.0 253.0 141.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 78.0 248.0 253.0 189.0 12.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 19.0 200.0 253.0 253.0 141.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 134.0 253.0 253.0 173.0 12.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 248.0 253.0 253.0 25.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 248.0 253.0 253.0 43.0 20.0 20.0 20.0 20.0 5.0 0.0 5.0 20.0 20.0 37.0 150.0 150.0 150.0 147.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 248.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 168.0 143.0 166.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 123.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 174.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 249.0 247.0 247.0 169.0 117.0 117.0 57.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 118.0 123.0 123.0 123.0 166.0 253.0 253.0 253.0 155.0 123.0 123.0 41.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 38.0 254.0 109.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 87.0 252.0 82.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 135.0 241.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 45.0 244.0 150.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 84.0 254.0 63.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 202.0 223.0 11.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 32.0 254.0 216.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 95.0 254.0 195.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 140.0 254.0 77.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 57.0 237.0 205.0 8.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 124.0 255.0 165.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 171.0 254.0 81.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 24.0 232.0 215.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 120.0 254.0 159.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 151.0 254.0 142.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 228.0 254.0 66.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 61.0 251.0 254.0 66.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 141.0 254.0 205.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 10.0 215.0 254.0 121.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 198.0 176.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 150.0 253.0 202.0 31.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 37.0 251.0 251.0 253.0 107.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 197.0 251.0 251.0 253.0 107.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 110.0 190.0 251.0 251.0 251.0 253.0 169.0 109.0 62.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 253.0 251.0 251.0 251.0 251.0 253.0 251.0 251.0 220.0 51.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 182.0 255.0 253.0 253.0 253.0 253.0 234.0 222.0 253.0 253.0 253.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 63.0 221.0 253.0 251.0 251.0 251.0 147.0 77.0 62.0 128.0 251.0 251.0 105.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 32.0 231.0 251.0 253.0 251.0 220.0 137.0 10.0 0.0 0.0 31.0 230.0 251.0 243.0 113.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 37.0 251.0 251.0 253.0 188.0 20.0 0.0 0.0 0.0 0.0 0.0 109.0 251.0 253.0 251.0 35.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 37.0 251.0 251.0 201.0 30.0 0.0 0.0 0.0 0.0 0.0 0.0 31.0 200.0 253.0 251.0 35.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 37.0 253.0 253.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 32.0 202.0 255.0 253.0 164.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 140.0 251.0 251.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 109.0 251.0 253.0 251.0 35.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 217.0 251.0 251.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 63.0 231.0 251.0 253.0 230.0 30.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 217.0 251.0 251.0 0.0 0.0 0.0 0.0 0.0 0.0 144.0 251.0 251.0 251.0 221.0 61.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 217.0 251.0 251.0 0.0 0.0 0.0 0.0 0.0 182.0 221.0 251.0 251.0 251.0 180.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 218.0 253.0 253.0 73.0 73.0 228.0 253.0 253.0 255.0 253.0 253.0 253.0 253.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 113.0 251.0 251.0 253.0 251.0 251.0 251.0 251.0 253.0 251.0 251.0 251.0 147.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 31.0 230.0 251.0 253.0 251.0 251.0 251.0 251.0 253.0 230.0 189.0 35.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 62.0 142.0 253.0 251.0 251.0 251.0 251.0 253.0 107.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 72.0 174.0 251.0 173.0 71.0 72.0 30.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 50.0 224.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 70.0 29.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 121.0 231.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 148.0 168.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 195.0 231.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 96.0 210.0 11.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 69.0 252.0 134.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 114.0 252.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 45.0 236.0 217.0 12.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 192.0 252.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 168.0 247.0 53.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 18.0 255.0 253.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 84.0 242.0 211.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 141.0 253.0 189.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 169.0 252.0 106.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 32.0 232.0 250.0 66.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 15.0 225.0 252.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 134.0 252.0 211.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 22.0 252.0 164.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 169.0 252.0 167.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 9.0 204.0 209.0 18.0 0.0 0.0 0.0 0.0 0.0 0.0 22.0 253.0 253.0 107.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 169.0 252.0 199.0 85.0 85.0 85.0 85.0 129.0 164.0 195.0 252.0 252.0 106.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 41.0 170.0 245.0 252.0 252.0 252.0 252.0 232.0 231.0 251.0 252.0 252.0 9.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 49.0 84.0 84.0 84.0 84.0 0.0 0.0 161.0 252.0 252.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 127.0 252.0 252.0 45.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 253.0 253.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 127.0 252.0 252.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 135.0 252.0 244.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 232.0 236.0 111.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 179.0 66.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 77.0 254.0 107.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 19.0 227.0 254.0 254.0 9.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 81.0 254.0 254.0 165.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 7.0 203.0 254.0 254.0 73.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 53.0 254.0 254.0 250.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 134.0 254.0 254.0 180.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 196.0 254.0 248.0 48.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 58.0 254.0 254.0 237.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 111.0 254.0 254.0 132.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 163.0 254.0 238.0 28.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 60.0 252.0 254.0 223.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 79.0 254.0 254.0 154.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 163.0 254.0 238.0 53.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 28.0 252.0 254.0 210.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 86.0 254.0 254.0 131.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 105.0 254.0 234.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 175.0 254.0 204.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 211.0 254.0 196.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 158.0 254.0 160.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 26.0 157.0 107.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 22.0 192.0 134.0 32.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 15.0 77.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 17.0 235.0 250.0 169.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 15.0 220.0 241.0 37.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 20.0 189.0 253.0 147.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 139.0 253.0 100.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 70.0 253.0 253.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 43.0 254.0 173.0 13.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 22.0 153.0 253.0 96.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 43.0 231.0 254.0 92.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 163.0 255.0 204.0 11.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 104.0 254.0 158.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 162.0 253.0 178.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 9.0 131.0 237.0 253.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 162.0 253.0 253.0 191.0 175.0 70.0 70.0 70.0 70.0 133.0 197.0 253.0 253.0 169.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 51.0 228.0 253.0 253.0 254.0 253.0 253.0 253.0 253.0 254.0 253.0 253.0 219.0 35.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 17.0 65.0 137.0 254.0 232.0 137.0 137.0 137.0 44.0 253.0 253.0 161.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 34.0 254.0 206.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 160.0 253.0 69.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 85.0 254.0 241.0 50.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 158.0 254.0 165.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 231.0 244.0 50.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 104.0 254.0 232.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 208.0 253.0 157.0 0.0 13.0 30.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 208.0 253.0 154.0 91.0 204.0 161.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 208.0 253.0 254.0 253.0 154.0 29.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 61.0 190.0 128.0 23.0 6.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 14.0 149.0 193.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 91.0 224.0 253.0 253.0 19.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 28.0 235.0 254.0 253.0 253.0 166.0 18.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 144.0 253.0 254.0 253.0 253.0 253.0 238.0 115.0 6.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 31.0 241.0 253.0 208.0 185.0 253.0 253.0 253.0 231.0 24.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 79.0 254.0 193.0 0.0 8.0 98.0 219.0 254.0 255.0 201.0 18.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 86.0 253.0 80.0 0.0 0.0 0.0 182.0 253.0 254.0 191.0 12.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 175.0 253.0 155.0 0.0 0.0 0.0 234.0 253.0 254.0 135.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 86.0 253.0 208.0 40.0 85.0 166.0 251.0 237.0 254.0 236.0 42.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 18.0 238.0 253.0 254.0 253.0 253.0 185.0 36.0 216.0 253.0 152.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 68.0 240.0 255.0 254.0 145.0 8.0 0.0 134.0 254.0 223.0 35.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 68.0 158.0 142.0 12.0 0.0 0.0 9.0 175.0 253.0 161.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 88.0 253.0 226.0 18.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 166.0 253.0 126.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 48.0 245.0 253.0 38.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 115.0 254.0 172.0 9.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 218.0 254.0 46.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 30.0 254.0 165.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 186.0 244.0 42.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 14.0 223.0 78.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 17.0 47.0 47.0 47.0 16.0 129.0 85.0 47.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 75.0 153.0 217.0 253.0 253.0 253.0 215.0 246.0 253.0 253.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 35.0 142.0 244.0 252.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 63.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 213.0 170.0 170.0 170.0 170.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 20.0 132.0 72.0 0.0 57.0 238.0 227.0 238.0 168.0 124.0 69.0 20.0 11.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 206.0 253.0 78.0 0.0 0.0 32.0 0.0 30.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 177.0 253.0 132.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 12.0 133.0 253.0 233.0 15.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 92.0 253.0 223.0 28.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 150.0 253.0 174.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 234.0 253.0 246.0 127.0 49.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 253.0 253.0 253.0 251.0 147.0 91.0 121.0 85.0 42.0 42.0 85.0 28.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 139.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 232.0 168.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 53.0 218.0 222.0 251.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 252.0 124.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 67.0 72.0 200.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 175.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 120.0 253.0 249.0 152.0 51.0 164.0 253.0 253.0 175.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 50.0 253.0 253.0 253.0 188.0 252.0 253.0 253.0 148.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 9.0 167.0 253.0 253.0 253.0 253.0 250.0 175.0 11.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 23.0 180.0 231.0 253.0 221.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 93.0 149.0 22.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 36.0 56.0 137.0 201.0 199.0 95.0 37.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 45.0 152.0 234.0 254.0 254.0 254.0 254.0 254.0 250.0 211.0 151.0 6.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 46.0 153.0 240.0 254.0 254.0 227.0 166.0 133.0 251.0 200.0 254.0 229.0 225.0 104.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 153.0 234.0 254.0 254.0 187.0 142.0 8.0 0.0 0.0 191.0 40.0 198.0 246.0 223.0 253.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 8.0 126.0 253.0 254.0 233.0 128.0 11.0 0.0 0.0 0.0 0.0 210.0 43.0 70.0 254.0 254.0 254.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 72.0 243.0 254.0 228.0 54.0 0.0 0.0 0.0 0.0 3.0 32.0 116.0 225.0 242.0 254.0 255.0 162.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 75.0 240.0 254.0 223.0 109.0 138.0 178.0 178.0 169.0 210.0 251.0 231.0 254.0 254.0 254.0 232.0 38.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 9.0 175.0 244.0 253.0 255.0 254.0 254.0 251.0 254.0 254.0 254.0 254.0 254.0 252.0 171.0 25.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 16.0 136.0 195.0 176.0 146.0 153.0 200.0 254.0 254.0 254.0 254.0 150.0 16.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 162.0 254.0 254.0 241.0 99.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 118.0 250.0 254.0 254.0 90.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 100.0 242.0 254.0 254.0 211.0 7.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 54.0 241.0 254.0 254.0 242.0 59.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 131.0 254.0 254.0 244.0 64.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 13.0 249.0 254.0 254.0 152.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 12.0 228.0 254.0 254.0 208.0 8.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 78.0 255.0 254.0 254.0 66.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 209.0 254.0 254.0 137.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 227.0 255.0 233.0 25.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 113.0 255.0 108.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 61.0 3.0 42.0 118.0 193.0 118.0 118.0 61.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 14.0 179.0 245.0 236.0 242.0 254.0 254.0 254.0 254.0 245.0 235.0 84.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 151.0 254.0 254.0 254.0 213.0 192.0 178.0 178.0 180.0 254.0 254.0 241.0 46.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 43.0 235.0 254.0 226.0 64.0 28.0 12.0 0.0 0.0 2.0 128.0 252.0 255.0 173.0 17.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 56.0 254.0 253.0 107.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 134.0 250.0 254.0 75.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 63.0 254.0 158.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 221.0 254.0 157.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 194.0 254.0 103.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 150.0 254.0 213.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 34.0 220.0 239.0 58.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 84.0 254.0 213.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 126.0 254.0 171.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 84.0 254.0 213.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 214.0 239.0 60.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 84.0 254.0 213.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 214.0 199.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 84.0 254.0 213.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 219.0 199.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 84.0 254.0 213.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 98.0 254.0 199.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 162.0 254.0 209.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 98.0 254.0 199.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 51.0 238.0 254.0 75.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 98.0 254.0 199.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 51.0 165.0 254.0 195.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 66.0 241.0 199.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 167.0 254.0 227.0 55.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 214.0 213.0 20.0 0.0 0.0 0.0 0.0 0.0 46.0 152.0 202.0 254.0 254.0 63.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 214.0 254.0 204.0 180.0 180.0 180.0 180.0 180.0 235.0 254.0 254.0 234.0 156.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 81.0 205.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 252.0 234.0 120.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 26.0 210.0 254.0 254.0 254.0 254.0 254.0 153.0 104.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 7.0 204.0 253.0 176.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 7.0 150.0 252.0 252.0 125.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 117.0 252.0 186.0 56.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 141.0 252.0 118.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 154.0 247.0 50.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 26.0 253.0 196.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 150.0 253.0 196.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 57.0 85.0 85.0 38.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 225.0 253.0 96.0 0.0 0.0 0.0 0.0 0.0 151.0 226.0 243.0 252.0 252.0 238.0 125.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 10.0 229.0 226.0 0.0 0.0 0.0 4.0 54.0 229.0 253.0 255.0 234.0 175.0 225.0 255.0 228.0 31.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 110.0 252.0 150.0 0.0 0.0 26.0 128.0 252.0 252.0 227.0 134.0 28.0 0.0 0.0 178.0 252.0 56.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 159.0 252.0 113.0 0.0 0.0 150.0 253.0 252.0 186.0 43.0 0.0 0.0 0.0 0.0 141.0 252.0 56.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 185.0 252.0 113.0 0.0 38.0 237.0 253.0 151.0 6.0 0.0 0.0 0.0 0.0 0.0 141.0 202.0 6.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 198.0 253.0 114.0 0.0 147.0 253.0 163.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 154.0 197.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 197.0 252.0 113.0 0.0 172.0 252.0 188.0 0.0 0.0 0.0 0.0 0.0 0.0 26.0 253.0 171.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 197.0 252.0 113.0 0.0 19.0 231.0 247.0 122.0 19.0 0.0 0.0 0.0 0.0 200.0 244.0 56.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 26.0 222.0 252.0 113.0 0.0 0.0 25.0 203.0 252.0 193.0 13.0 0.0 76.0 200.0 249.0 125.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 185.0 253.0 179.0 10.0 0.0 0.0 0.0 76.0 35.0 29.0 154.0 253.0 244.0 125.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 28.0 209.0 253.0 196.0 82.0 57.0 57.0 131.0 197.0 252.0 253.0 214.0 81.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 25.0 216.0 252.0 252.0 252.0 253.0 252.0 252.0 252.0 156.0 19.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 16.0 103.0 139.0 240.0 140.0 139.0 139.0 40.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 49.0 180.0 253.0 255.0 253.0 169.0 36.0 11.0 76.0 9.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 68.0 228.0 252.0 252.0 253.0 252.0 252.0 160.0 189.0 253.0 92.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 55.0 252.0 252.0 227.0 79.0 69.0 69.0 100.0 90.0 236.0 247.0 67.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 43.0 233.0 252.0 185.0 50.0 0.0 0.0 0.0 26.0 203.0 252.0 135.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 168.0 253.0 178.0 37.0 0.0 0.0 0.0 0.0 70.0 252.0 252.0 63.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 155.0 253.0 242.0 42.0 0.0 0.0 0.0 0.0 5.0 191.0 253.0 190.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 207.0 252.0 230.0 0.0 0.0 0.0 0.0 5.0 136.0 252.0 252.0 64.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 207.0 252.0 230.0 0.0 0.0 0.0 32.0 138.0 252.0 252.0 227.0 16.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 165.0 252.0 249.0 207.0 207.0 207.0 228.0 253.0 252.0 252.0 160.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 9.0 179.0 253.0 252.0 252.0 252.0 252.0 75.0 169.0 252.0 56.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 116.0 116.0 74.0 0.0 149.0 253.0 215.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 253.0 252.0 162.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 32.0 253.0 240.0 50.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 157.0 253.0 164.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 43.0 240.0 253.0 92.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 93.0 253.0 252.0 84.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 114.0 252.0 209.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 207.0 252.0 116.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 165.0 252.0 116.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 93.0 200.0 63.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 17.0 66.0 138.0 255.0 253.0 169.0 138.0 23.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 120.0 228.0 252.0 252.0 253.0 252.0 252.0 252.0 158.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 108.0 252.0 252.0 252.0 252.0 190.0 252.0 252.0 252.0 252.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 43.0 233.0 252.0 252.0 252.0 116.0 5.0 135.0 252.0 252.0 252.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 43.0 178.0 253.0 252.0 221.0 43.0 2.0 0.0 5.0 54.0 232.0 252.0 210.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 93.0 253.0 255.0 249.0 115.0 0.0 0.0 0.0 0.0 0.0 136.0 251.0 255.0 154.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 166.0 252.0 253.0 185.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 209.0 253.0 206.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 19.0 220.0 252.0 253.0 92.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 116.0 253.0 206.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 70.0 252.0 252.0 192.0 17.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 116.0 253.0 223.0 25.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 122.0 252.0 252.0 63.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 116.0 253.0 252.0 69.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 132.0 253.0 253.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 116.0 255.0 253.0 69.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 184.0 252.0 252.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 116.0 253.0 252.0 69.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 184.0 252.0 252.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 116.0 253.0 240.0 50.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 184.0 252.0 252.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 210.0 253.0 112.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 48.0 232.0 252.0 158.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 230.0 232.0 8.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 93.0 253.0 244.0 50.0 0.0 0.0 0.0 0.0 0.0 0.0 155.0 253.0 168.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 34.0 164.0 253.0 113.0 0.0 0.0 0.0 0.0 0.0 66.0 236.0 231.0 42.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 32.0 222.0 240.0 134.0 0.0 0.0 38.0 91.0 234.0 252.0 137.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 25.0 177.0 240.0 207.0 103.0 233.0 252.0 252.0 176.0 35.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 15.0 54.0 179.0 252.0 137.0 137.0 54.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 255.0 191.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 191.0 255.0 255.0 64.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 255.0 255.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 255.0 255.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 255.0 255.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 255.0 255.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 255.0 255.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 255.0 255.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 255.0 255.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 255.0 255.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 255.0 255.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 255.0 255.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 255.0 255.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 255.0 255.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 191.0 255.0 255.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 191.0 255.0 255.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 255.0 255.0 255.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 191.0 255.0 255.0 255.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 255.0 255.0 255.0 64.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 255.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 51.0 132.0 214.0 253.0 254.0 253.0 203.0 162.0 41.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 102.0 142.0 203.0 203.0 253.0 252.0 253.0 252.0 151.0 70.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 253.0 244.0 203.0 142.0 102.0 82.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 172.0 252.0 203.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 223.0 234.0 30.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 122.0 253.0 50.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 123.0 254.0 91.0 51.0 51.0 51.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 223.0 253.0 252.0 253.0 252.0 253.0 172.0 82.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 214.0 253.0 203.0 162.0 102.0 102.0 203.0 223.0 254.0 253.0 51.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 61.0 253.0 171.0 0.0 0.0 0.0 0.0 0.0 20.0 112.0 192.0 253.0 212.0 41.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 102.0 203.0 234.0 51.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 20.0 213.0 232.0 82.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 62.0 203.0 234.0 112.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 20.0 213.0 252.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 153.0 253.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 41.0 233.0 212.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 113.0 92.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 31.0 173.0 244.0 40.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 82.0 253.0 151.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 102.0 102.0 183.0 233.0 212.0 81.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 82.0 255.0 253.0 234.0 152.0 153.0 193.0 173.0 253.0 254.0 253.0 254.0 213.0 142.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 71.0 151.0 151.0 232.0 253.0 212.0 192.0 151.0 131.0 50.0 50.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 146.0 229.0 255.0 205.0 120.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 24.0 198.0 252.0 253.0 225.0 216.0 235.0 252.0 89.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 20.0 205.0 253.0 223.0 70.0 15.0 0.0 29.0 206.0 174.0 2.0 87.0 38.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 137.0 253.0 227.0 6.0 0.0 0.0 0.0 0.0 35.0 28.0 76.0 253.0 253.0 9.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 88.0 251.0 235.0 12.0 0.0 0.0 0.0 0.0 0.0 0.0 42.0 238.0 253.0 174.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 134.0 253.0 192.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 14.0 238.0 253.0 161.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 169.0 253.0 74.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 85.0 247.0 253.0 75.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 10.0 250.0 253.0 47.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 219.0 253.0 241.0 31.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 10.0 253.0 253.0 47.0 0.0 0.0 0.0 0.0 0.0 5.0 72.0 253.0 253.0 143.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 221.0 253.0 117.0 0.0 0.0 0.0 0.0 25.0 118.0 253.0 253.0 253.0 47.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 28.0 242.0 254.0 187.0 104.0 146.0 159.0 220.0 244.0 239.0 254.0 224.0 18.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 78.0 201.0 253.0 253.0 248.0 215.0 156.0 67.0 247.0 253.0 157.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 56.0 56.0 50.0 0.0 0.0 38.0 253.0 253.0 74.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 66.0 253.0 253.0 18.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 149.0 253.0 253.0 18.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 30.0 238.0 253.0 191.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 66.0 253.0 253.0 112.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 87.0 253.0 244.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 170.0 253.0 198.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 253.0 149.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 74.0 249.0 254.0 254.0 254.0 245.0 167.0 167.0 136.0 25.0 80.0 60.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 104.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 249.0 254.0 252.0 197.0 113.0 71.0 39.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 99.0 135.0 105.0 105.0 114.0 192.0 192.0 192.0 233.0 254.0 254.0 254.0 254.0 254.0 246.0 129.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 45.0 114.0 114.0 203.0 254.0 254.0 254.0 240.0 15.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 8.0 35.0 155.0 254.0 254.0 130.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 36.0 254.0 241.0 34.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 115.0 254.0 254.0 118.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 34.0 243.0 254.0 240.0 17.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 111.0 254.0 254.0 139.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 37.0 243.0 254.0 244.0 40.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 20.0 176.0 254.0 254.0 113.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 140.0 254.0 254.0 220.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 88.0 253.0 254.0 243.0 45.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 63.0 241.0 254.0 254.0 83.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 16.0 243.0 254.0 254.0 147.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 111.0 254.0 254.0 203.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 58.0 254.0 254.0 254.0 84.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 14.0 237.0 254.0 255.0 194.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 82.0 254.0 254.0 194.0 27.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 39.0 230.0 193.0 28.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 12.0 41.0 146.0 146.0 48.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 12.0 129.0 253.0 253.0 253.0 250.0 163.0 18.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 133.0 253.0 253.0 253.0 253.0 253.0 253.0 229.0 70.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 101.0 253.0 252.0 145.0 102.0 107.0 237.0 253.0 247.0 128.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 181.0 253.0 167.0 0.0 0.0 0.0 61.0 235.0 253.0 253.0 163.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 253.0 43.0 0.0 0.0 0.0 0.0 58.0 193.0 253.0 253.0 164.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 187.0 253.0 32.0 0.0 0.0 0.0 0.0 0.0 55.0 236.0 253.0 253.0 86.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 146.0 253.0 32.0 0.0 100.0 190.0 87.0 87.0 87.0 147.0 253.0 253.0 123.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 94.0 253.0 78.0 40.0 248.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 223.0 84.0 15.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 14.0 92.0 12.0 35.0 240.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 244.0 89.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 75.0 161.0 179.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 209.0 43.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 16.0 16.0 39.0 38.0 16.0 16.0 145.0 243.0 253.0 253.0 185.0 48.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 20.0 58.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 58.0 209.0 253.0 253.0 183.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 77.0 221.0 247.0 79.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 13.0 219.0 253.0 240.0 72.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 90.0 247.0 253.0 252.0 57.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 53.0 251.0 253.0 191.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 116.0 253.0 253.0 59.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 99.0 252.0 253.0 145.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 14.0 188.0 253.0 221.0 158.0 38.0 0.0 0.0 0.0 0.0 111.0 211.0 246.0 253.0 253.0 145.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 12.0 221.0 246.0 253.0 251.0 249.0 249.0 249.0 249.0 253.0 253.0 253.0 253.0 200.0 19.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 95.0 183.0 228.0 253.0 253.0 253.0 253.0 253.0 253.0 195.0 124.0 23.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 24.0 37.0 138.0 74.0 126.0 88.0 37.0 7.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 168.0 91.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 234.0 126.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 51.0 254.0 126.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 38.0 178.0 31.0 0.0 0.0 0.0 0.0 0.0 51.0 254.0 81.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 94.0 254.0 83.0 0.0 0.0 0.0 0.0 0.0 87.0 254.0 54.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 160.0 254.0 56.0 0.0 0.0 0.0 0.0 0.0 189.0 238.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 13.0 227.0 168.0 2.0 0.0 0.0 0.0 0.0 0.0 194.0 236.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 55.0 254.0 114.0 0.0 0.0 0.0 0.0 0.0 16.0 235.0 167.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 115.0 254.0 50.0 0.0 0.0 0.0 0.0 0.0 103.0 254.0 105.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 7.0 221.0 236.0 75.0 156.0 180.0 190.0 252.0 252.0 253.0 254.0 114.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 15.0 254.0 254.0 254.0 252.0 211.0 179.0 179.0 179.0 246.0 254.0 247.0 94.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 8.0 217.0 239.0 117.0 22.0 0.0 0.0 0.0 0.0 226.0 254.0 242.0 197.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 14.0 18.0 0.0 0.0 0.0 0.0 0.0 27.0 243.0 207.0 46.0 37.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 99.0 254.0 132.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 116.0 254.0 67.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 116.0 254.0 61.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 116.0 254.0 61.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 174.0 255.0 100.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 187.0 254.0 83.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 115.0 176.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 31.0 140.0 193.0 44.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 38.0 146.0 240.0 254.0 254.0 228.0 48.0 77.0 46.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 43.0 230.0 254.0 254.0 254.0 254.0 254.0 241.0 254.0 197.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 130.0 254.0 254.0 254.0 239.0 252.0 254.0 254.0 254.0 254.0 237.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 154.0 254.0 254.0 249.0 104.0 71.0 198.0 254.0 254.0 254.0 234.0 57.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 173.0 252.0 252.0 206.0 51.0 120.0 215.0 254.0 254.0 254.0 254.0 184.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 112.0 254.0 254.0 215.0 87.0 247.0 254.0 254.0 254.0 254.0 254.0 217.0 31.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 231.0 254.0 254.0 254.0 254.0 254.0 236.0 128.0 196.0 254.0 254.0 119.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 197.0 254.0 254.0 245.0 238.0 131.0 17.0 46.0 247.0 254.0 199.0 14.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 16.0 92.0 88.0 40.0 0.0 0.0 12.0 173.0 254.0 242.0 38.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 95.0 254.0 254.0 155.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 18.0 210.0 254.0 225.0 6.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 197.0 254.0 254.0 99.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 34.0 242.0 254.0 179.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 27.0 223.0 254.0 225.0 30.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 77.0 254.0 255.0 127.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 54.0 238.0 254.0 248.0 53.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 183.0 254.0 254.0 231.0 41.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 113.0 254.0 254.0 230.0 48.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 110.0 239.0 126.0 25.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 49.0 180.0 253.0 244.0 50.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 184.0 252.0 252.0 232.0 164.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 66.0 234.0 252.0 136.0 38.0 56.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 19.0 236.0 252.0 176.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 76.0 252.0 252.0 56.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 139.0 253.0 173.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 22.0 212.0 252.0 69.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 116.0 253.0 240.0 50.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 157.0 253.0 206.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 230.0 253.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 231.0 255.0 180.0 138.0 180.0 253.0 255.0 253.0 222.0 97.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 230.0 253.0 252.0 252.0 252.0 252.0 211.0 252.0 252.0 252.0 117.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 230.0 253.0 240.0 183.0 89.0 69.0 7.0 69.0 171.0 252.0 252.0 85.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 135.0 253.0 153.0 0.0 0.0 0.0 0.0 0.0 13.0 215.0 252.0 116.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 116.0 253.0 206.0 0.0 0.0 0.0 0.0 0.0 0.0 155.0 252.0 116.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 106.0 255.0 211.0 7.0 0.0 0.0 0.0 0.0 49.0 233.0 253.0 116.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 159.0 252.0 154.0 9.0 0.0 0.0 30.0 197.0 252.0 252.0 95.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 17.0 227.0 252.0 154.0 70.0 81.0 228.0 252.0 227.0 130.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 50.0 227.0 252.0 252.0 253.0 252.0 185.0 50.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 48.0 179.0 252.0 190.0 117.0 6.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 114.0 255.0 57.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 226.0 255.0 57.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 29.0 255.0 114.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 114.0 255.0 86.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 198.0 255.0 29.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 29.0 255.0 226.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 141.0 255.0 141.0 0.0 0.0 0.0 0.0 0.0 0.0 57.0 86.0 86.0 141.0 57.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 170.0 255.0 86.0 0.0 0.0 0.0 0.0 0.0 57.0 226.0 255.0 255.0 255.0 255.0 57.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 170.0 255.0 86.0 0.0 0.0 0.0 0.0 0.0 170.0 255.0 255.0 114.0 57.0 226.0 198.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 170.0 255.0 86.0 0.0 0.0 0.0 0.0 57.0 255.0 255.0 86.0 0.0 0.0 170.0 255.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 170.0 255.0 86.0 0.0 0.0 0.0 0.0 170.0 255.0 86.0 0.0 0.0 0.0 170.0 255.0 86.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 141.0 255.0 114.0 0.0 0.0 0.0 29.0 255.0 198.0 0.0 0.0 0.0 0.0 170.0 255.0 86.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 29.0 255.0 255.0 0.0 0.0 0.0 170.0 255.0 114.0 0.0 0.0 0.0 0.0 198.0 226.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 198.0 255.0 114.0 0.0 0.0 170.0 255.0 86.0 0.0 0.0 0.0 86.0 255.0 114.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 86.0 255.0 255.0 170.0 57.0 255.0 255.0 29.0 0.0 0.0 86.0 226.0 226.0 29.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 114.0 226.0 255.0 255.0 255.0 255.0 86.0 86.0 170.0 255.0 255.0 57.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 29.0 141.0 255.0 255.0 255.0 255.0 255.0 255.0 198.0 29.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 226.0 255.0 255.0 141.0 86.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 141.0 255.0 255.0 170.0 170.0 57.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 141.0 226.0 170.0 114.0 29.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 69.0 152.0 237.0 254.0 254.0 255.0 254.0 252.0 52.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 87.0 164.0 237.0 253.0 254.0 218.0 138.0 83.0 39.0 154.0 254.0 135.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 138.0 246.0 253.0 254.0 216.0 167.0 54.0 5.0 0.0 0.0 0.0 100.0 191.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 233.0 254.0 169.0 53.0 6.0 0.0 0.0 0.0 0.0 0.0 0.0 35.0 8.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 174.0 254.0 94.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 38.0 245.0 221.0 13.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 142.0 254.0 149.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 151.0 254.0 112.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 226.0 242.0 32.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 12.0 240.0 203.0 44.0 44.0 44.0 44.0 8.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 70.0 254.0 254.0 254.0 254.0 254.0 254.0 205.0 85.0 8.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 37.0 184.0 169.0 133.0 133.0 162.0 212.0 254.0 254.0 166.0 8.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 9.0 51.0 177.0 254.0 125.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 27.0 209.0 254.0 104.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 63.0 209.0 254.0 194.0 13.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 0.0 10.0 137.0 244.0 254.0 198.0 52.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 13.0 87.0 122.0 147.0 223.0 254.0 247.0 127.0 13.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 118.0 250.0 210.0 248.0 254.0 252.0 199.0 49.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 138.0 254.0 254.0 254.0 250.0 201.0 72.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 79.0 167.0 197.0 87.0 7.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 197.0 60.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 50.0 243.0 42.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 186.0 236.0 21.0 0.0 0.0 0.0 134.0 83.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 88.0 213.0 26.0 0.0 0.0 0.0 0.0 129.0 170.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 120.0 0.0 0.0 0.0 0.0 0.0 91.0 209.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 32.0 234.0 112.0 0.0 0.0 0.0 0.0 0.0 91.0 242.0 30.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 116.0 222.0 21.0 0.0 0.0 0.0 0.0 0.0 170.0 244.0 58.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 30.0 240.0 124.0 0.0 0.0 0.0 0.0 0.0 40.0 249.0 138.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 127.0 241.0 18.0 0.0 0.0 0.0 0.0 0.0 15.0 230.0 134.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 16.0 254.0 179.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 165.0 134.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 9.0 191.0 233.0 136.0 101.0 20.0 0.0 0.0 0.0 0.0 113.0 215.0 31.0 31.0 31.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 8.0 89.0 128.0 194.0 218.0 210.0 210.0 211.0 210.0 226.0 254.0 254.0 204.0 120.0 7.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 10.0 15.0 37.0 90.0 90.0 196.0 241.0 34.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 165.0 233.0 16.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 165.0 143.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 91.0 188.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 91.0 233.0 34.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 20.0 254.0 61.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 209.0 219.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 107.0 166.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 80.0 195.0 85.0 80.0 80.0 80.0 14.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 9.0 253.0 253.0 253.0 253.0 253.0 253.0 152.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 62.0 56.0 0.0 9.0 253.0 253.0 253.0 253.0 253.0 253.0 251.0 237.0 57.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 141.0 253.0 241.0 83.0 4.0 161.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 60.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 141.0 248.0 253.0 253.0 147.0 0.0 73.0 209.0 252.0 253.0 253.0 253.0 253.0 253.0 212.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 147.0 253.0 253.0 253.0 253.0 199.0 34.0 0.0 0.0 160.0 253.0 142.0 194.0 253.0 253.0 244.0 77.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 9.0 136.0 250.0 253.0 253.0 253.0 253.0 253.0 69.0 0.0 0.0 15.0 52.0 5.0 27.0 201.0 253.0 253.0 156.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 80.0 253.0 253.0 253.0 253.0 253.0 253.0 209.0 41.0 0.0 0.0 0.0 0.0 0.0 0.0 36.0 253.0 253.0 196.0 33.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 86.0 253.0 253.0 253.0 253.0 253.0 234.0 41.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 42.0 253.0 253.0 253.0 78.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 253.0 253.0 253.0 253.0 253.0 165.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 211.0 253.0 253.0 253.0 78.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 253.0 253.0 253.0 253.0 172.0 18.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 211.0 253.0 253.0 253.0 78.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 253.0 253.0 253.0 210.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 42.0 229.0 246.0 252.0 253.0 253.0 159.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 253.0 253.0 253.0 209.0 0.0 0.0 0.0 0.0 0.0 99.0 149.0 210.0 253.0 253.0 253.0 253.0 242.0 65.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 253.0 253.0 253.0 218.0 53.0 53.0 53.0 180.0 228.0 244.0 253.0 253.0 253.0 253.0 253.0 253.0 77.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 163.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 193.0 29.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 80.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 234.0 193.0 24.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 44.0 210.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 229.0 67.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 38.0 228.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 248.0 235.0 65.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 39.0 210.0 253.0 253.0 253.0 253.0 253.0 253.0 189.0 114.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 43.0 108.0 253.0 253.0 179.0 78.0 78.0 27.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 0.0 0.0 0.0 11.0 92.0 173.0 253.0 254.0 253.0 254.0 253.0 62.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 142.0 0.0 21.0 102.0 213.0 252.0 233.0 151.0 131.0 131.0 253.0 252.0 142.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 163.0 152.0 152.0 214.0 233.0 183.0 102.0 0.0 0.0 0.0 0.0 132.0 253.0 255.0 50.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 82.0 243.0 253.0 252.0 131.0 30.0 0.0 0.0 0.0 0.0 0.0 0.0 10.0 212.0 253.0 131.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 123.0 203.0 102.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 203.0 255.0 151.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 162.0 253.0 151.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 102.0 254.0 151.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 102.0 253.0 151.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 163.0 254.0 91.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 203.0 253.0 50.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 203.0 203.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 223.0 122.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 72.0 253.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 233.0 252.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 233.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 41.0 253.0 151.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 123.0 254.0 50.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 223.0 233.0 30.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 51.0 253.0 183.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 51.0 252.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 221.0 115.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 51.0 254.0 148.0 0.0 0.0 0.0 0.0 22.0 230.0 134.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 168.0 254.0 115.0 0.0 0.0 0.0 0.0 24.0 253.0 184.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 51.0 234.0 254.0 81.0 0.0 0.0 0.0 0.0 91.0 253.0 184.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 13.0 221.0 254.0 160.0 0.0 0.0 0.0 0.0 0.0 141.0 254.0 127.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 114.0 253.0 253.0 76.0 0.0 0.0 0.0 0.0 0.0 207.0 253.0 93.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 15.0 232.0 253.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 207.0 253.0 17.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 229.0 253.0 202.0 19.0 0.0 0.0 0.0 0.0 0.0 34.0 240.0 253.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 7.0 170.0 254.0 254.0 46.0 0.0 0.0 0.0 0.0 0.0 0.0 47.0 254.0 254.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 24.0 253.0 254.0 253.0 234.0 163.0 47.0 47.0 26.0 0.0 0.0 130.0 253.0 253.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 246.0 254.0 253.0 253.0 253.0 254.0 253.0 232.0 174.0 208.0 232.0 253.0 177.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 84.0 161.0 211.0 219.0 219.0 254.0 253.0 253.0 253.0 254.0 253.0 244.0 69.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 93.0 142.0 142.0 93.0 170.0 254.0 230.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 153.0 253.0 213.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 170.0 253.0 137.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 220.0 253.0 137.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 60.0 255.0 254.0 80.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 93.0 254.0 253.0 46.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 51.0 254.0 215.0 9.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 186.0 106.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 32.0 255.0 254.0 255.0 254.0 254.0 254.0 157.0 130.0 88.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 32.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 108.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 14.0 129.0 238.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 30.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 56.0 253.0 248.0 167.0 235.0 253.0 253.0 253.0 253.0 104.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 178.0 253.0 182.0 0.0 27.0 134.0 247.0 253.0 253.0 215.0 15.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 130.0 253.0 222.0 27.0 0.0 0.0 0.0 186.0 253.0 253.0 253.0 24.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 32.0 253.0 253.0 122.0 0.0 0.0 0.0 0.0 67.0 246.0 253.0 253.0 106.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 117.0 253.0 199.0 25.0 0.0 0.0 0.0 0.0 0.0 187.0 253.0 253.0 148.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 46.0 225.0 245.0 67.0 0.0 0.0 0.0 0.0 0.0 0.0 88.0 253.0 253.0 148.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 149.0 253.0 185.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 88.0 253.0 253.0 148.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 15.0 228.0 253.0 93.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 88.0 253.0 253.0 148.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 19.0 253.0 253.0 93.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 88.0 253.0 253.0 148.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 19.0 253.0 253.0 93.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 88.0 253.0 253.0 109.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 19.0 253.0 253.0 134.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 88.0 253.0 219.0 16.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 19.0 253.0 253.0 230.0 32.0 0.0 0.0 0.0 0.0 0.0 0.0 132.0 253.0 154.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 19.0 253.0 253.0 253.0 233.0 120.0 0.0 74.0 100.0 100.0 200.0 248.0 217.0 33.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 159.0 253.0 253.0 253.0 249.0 230.0 247.0 253.0 253.0 253.0 253.0 109.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 95.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 118.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 41.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 119.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 16.0 51.0 88.0 214.0 165.0 99.0 5.0 5.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 218.0 253.0 11.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 217.0 252.0 92.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 200.0 252.0 252.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 79.0 204.0 250.0 24.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 79.0 249.0 149.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 109.0 252.0 241.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 207.0 252.0 241.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 126.0 252.0 241.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 160.0 252.0 241.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 229.0 252.0 253.0 103.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 53.0 184.0 255.0 171.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 121.0 253.0 228.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 121.0 253.0 228.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 121.0 253.0 228.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 121.0 253.0 228.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 213.0 253.0 235.0 28.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 201.0 253.0 252.0 96.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 121.0 253.0 252.0 96.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 121.0 253.0 252.0 96.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 195.0 241.0 50.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 113.0 193.0 254.0 253.0 254.0 253.0 254.0 172.0 82.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 183.0 253.0 252.0 253.0 252.0 253.0 252.0 253.0 252.0 243.0 40.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 203.0 255.0 233.0 183.0 102.0 203.0 203.0 234.0 253.0 254.0 151.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 81.0 151.0 50.0 0.0 0.0 0.0 41.0 193.0 252.0 253.0 111.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 213.0 254.0 253.0 203.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 123.0 213.0 252.0 253.0 252.0 81.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 51.0 253.0 254.0 253.0 254.0 151.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 10.0 212.0 253.0 252.0 253.0 232.0 223.0 122.0 82.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 123.0 223.0 254.0 253.0 254.0 253.0 254.0 71.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 20.0 50.0 131.0 213.0 252.0 253.0 192.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 162.0 254.0 253.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 203.0 253.0 252.0 61.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 132.0 253.0 254.0 91.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 142.0 253.0 252.0 233.0 30.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 41.0 214.0 253.0 254.0 213.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 163.0 243.0 253.0 252.0 172.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 173.0 173.0 253.0 255.0 253.0 224.0 81.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 132.0 252.0 253.0 252.0 253.0 171.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 153.0 253.0 244.0 203.0 82.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 92.0 192.0 122.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 203.0 193.0 30.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 203.0 253.0 131.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 102.0 254.0 151.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 102.0 253.0 151.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 41.0 254.0 253.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 253.0 252.0 82.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 152.0 253.0 203.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 152.0 252.0 203.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 92.0 253.0 214.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 10.0 212.0 253.0 50.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 203.0 254.0 112.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 162.0 253.0 151.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 102.0 254.0 151.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 102.0 253.0 192.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 102.0 254.0 253.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 102.0 253.0 252.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 41.0 255.0 253.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 253.0 252.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 173.0 253.0 62.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 51.0 252.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 99.0 254.0 254.0 254.0 254.0 217.0 118.0 41.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 178.0 247.0 253.0 253.0 253.0 253.0 253.0 253.0 140.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 244.0 253.0 208.0 177.0 177.0 55.0 99.0 253.0 249.0 92.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 19.0 165.0 179.0 25.0 0.0 0.0 0.0 69.0 253.0 253.0 109.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 69.0 253.0 249.0 95.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 13.0 153.0 253.0 143.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 57.0 240.0 253.0 253.0 89.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 111.0 247.0 253.0 253.0 227.0 41.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 31.0 228.0 253.0 253.0 253.0 253.0 253.0 221.0 88.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 35.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 252.0 206.0 48.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 28.0 205.0 205.0 205.0 82.0 68.0 68.0 188.0 253.0 253.0 226.0 51.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 58.0 167.0 253.0 253.0 224.0 36.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 176.0 253.0 253.0 58.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 173.0 253.0 221.0 37.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 104.0 253.0 253.0 75.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 41.0 227.0 253.0 253.0 75.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 12.0 63.0 140.0 226.0 253.0 253.0 238.0 57.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 41.0 42.0 153.0 193.0 253.0 253.0 253.0 253.0 217.0 86.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 29.0 158.0 251.0 253.0 253.0 253.0 253.0 253.0 232.0 102.0 13.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 16.0 116.0 186.0 253.0 253.0 253.0 227.0 116.0 113.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 16.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 187.0 176.0 76.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 22.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 137.0 254.0 113.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 134.0 139.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 108.0 254.0 113.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 69.0 248.0 254.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 213.0 254.0 113.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 133.0 254.0 204.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 44.0 240.0 254.0 113.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 202.0 254.0 78.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 101.0 254.0 254.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 7.0 207.0 245.0 16.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 12.0 216.0 254.0 173.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 86.0 254.0 153.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 155.0 254.0 254.0 47.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 184.0 254.0 153.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 78.0 240.0 254.0 222.0 8.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 15.0 206.0 254.0 153.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 14.0 203.0 254.0 254.0 48.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 48.0 254.0 254.0 54.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 36.0 254.0 254.0 173.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 48.0 254.0 254.0 35.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 71.0 204.0 254.0 218.0 25.0 0.0 1.0 12.0 12.0 12.0 7.0 12.0 12.0 1.0 0.0 48.0 254.0 173.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 150.0 254.0 254.0 225.0 148.0 148.0 151.0 254.0 254.0 255.0 205.0 254.0 254.0 90.0 13.0 118.0 254.0 157.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 233.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 218.0 225.0 211.0 254.0 203.0 224.0 254.0 53.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 107.0 254.0 254.0 224.0 201.0 189.0 189.0 123.0 71.0 71.0 17.0 27.0 7.0 69.0 178.0 254.0 207.0 15.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 53.0 53.0 28.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 148.0 254.0 150.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 35.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 228.0 211.0 89.0 0.0 0.0 0.0 0.0 0.0 0.0 51.0 121.0 121.0 226.0 253.0 232.0 44.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 61.0 235.0 249.0 240.0 240.0 240.0 240.0 240.0 241.0 245.0 252.0 252.0 252.0 252.0 252.0 93.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 183.0 252.0 252.0 252.0 252.0 252.0 253.0 252.0 252.0 252.0 252.0 252.0 252.0 93.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 39.0 39.0 53.0 95.0 39.0 39.0 39.0 39.0 219.0 252.0 252.0 197.0 63.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 75.0 244.0 252.0 209.0 17.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 122.0 252.0 252.0 198.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 95.0 244.0 252.0 252.0 177.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 13.0 241.0 252.0 252.0 126.0 24.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 8.0 197.0 252.0 252.0 248.0 50.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 8.0 196.0 253.0 252.0 252.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 13.0 197.0 253.0 255.0 253.0 159.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 17.0 123.0 252.0 252.0 253.0 252.0 103.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 90.0 252.0 252.0 252.0 253.0 37.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 17.0 198.0 252.0 252.0 209.0 110.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 18.0 176.0 252.0 252.0 248.0 88.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 17.0 107.0 252.0 252.0 252.0 140.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 171.0 252.0 252.0 252.0 233.0 33.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 10.0 217.0 252.0 252.0 252.0 140.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 89.0 250.0 252.0 252.0 221.0 39.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 213.0 217.0 217.0 79.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 36.0 125.0 191.0 218.0 255.0 254.0 254.0 241.0 51.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 204.0 249.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 250.0 235.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 88.0 241.0 251.0 253.0 225.0 142.0 49.0 12.0 12.0 12.0 105.0 253.0 253.0 111.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 95.0 225.0 253.0 167.0 113.0 14.0 0.0 0.0 0.0 0.0 0.0 16.0 211.0 253.0 117.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 91.0 238.0 253.0 170.0 28.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 150.0 253.0 117.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 98.0 251.0 218.0 48.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 150.0 253.0 117.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 112.0 253.0 112.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 9.0 184.0 242.0 18.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 20.0 45.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 67.0 253.0 240.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 27.0 234.0 248.0 105.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 44.0 157.0 253.0 132.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 189.0 253.0 203.0 27.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 156.0 253.0 246.0 77.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 156.0 253.0 202.0 68.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 156.0 253.0 226.0 71.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 30.0 33.0 33.0 140.0 163.0 186.0 253.0 226.0 38.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 12.0 81.0 244.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 186.0 70.0 23.0 0.0 0.0 22.0 156.0 77.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 80.0 195.0 253.0 253.0 253.0 253.0 253.0 248.0 234.0 166.0 248.0 253.0 253.0 240.0 150.0 73.0 144.0 104.0 51.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 7.0 248.0 253.0 253.0 253.0 253.0 253.0 242.0 105.0 0.0 0.0 107.0 242.0 253.0 253.0 253.0 245.0 160.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 57.0 250.0 253.0 253.0 253.0 247.0 135.0 21.0 0.0 0.0 0.0 0.0 21.0 117.0 183.0 183.0 48.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 121.0 123.0 176.0 135.0 16.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 61.0 156.0 148.0 89.0 81.0 156.0 255.0 254.0 254.0 254.0 216.0 156.0 148.0 41.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 26.0 207.0 254.0 253.0 253.0 253.0 245.0 234.0 195.0 233.0 233.0 233.0 246.0 253.0 241.0 24.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 166.0 253.0 254.0 253.0 253.0 128.0 48.0 0.0 0.0 0.0 0.0 0.0 48.0 226.0 253.0 87.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 174.0 251.0 253.0 244.0 124.0 19.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 214.0 253.0 19.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 132.0 253.0 253.0 177.0 45.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 46.0 244.0 253.0 19.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 195.0 90.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 179.0 254.0 152.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 8.0 254.0 251.0 72.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 165.0 254.0 165.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 37.0 248.0 254.0 46.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 77.0 253.0 171.0 9.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 19.0 239.0 254.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 92.0 253.0 253.0 215.0 214.0 214.0 181.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 19.0 167.0 253.0 253.0 253.0 254.0 253.0 253.0 213.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 201.0 253.0 253.0 253.0 185.0 117.0 34.0 19.0 16.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 119.0 73.0 193.0 237.0 36.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 80.0 254.0 214.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 118.0 253.0 168.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 118.0 253.0 117.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 118.0 253.0 117.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 72.0 193.0 34.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 13.0 218.0 209.0 62.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 189.0 252.0 185.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 169.0 252.0 215.0 6.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 169.0 252.0 253.0 63.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 169.0 252.0 253.0 63.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 109.0 253.0 254.0 168.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 252.0 253.0 168.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 59.0 249.0 253.0 210.0 11.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 211.0 253.0 252.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 211.0 253.0 252.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 212.0 255.0 253.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 211.0 253.0 252.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 211.0 253.0 252.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 167.0 253.0 252.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 211.0 253.0 252.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 212.0 255.0 253.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 131.0 253.0 252.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 106.0 253.0 252.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 106.0 253.0 252.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 18.0 209.0 182.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 50.0 170.0 254.0 59.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 36.0 191.0 245.0 254.0 254.0 175.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 70.0 242.0 254.0 235.0 233.0 254.0 182.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 23.0 184.0 254.0 243.0 99.0 27.0 110.0 254.0 182.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 20.0 205.0 247.0 98.0 26.0 0.0 0.0 110.0 254.0 149.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 40.0 104.0 20.0 0.0 0.0 0.0 0.0 110.0 254.0 33.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 110.0 234.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 32.0 214.0 149.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 134.0 200.0 16.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 20.0 231.0 144.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 146.0 244.0 72.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 16.0 201.0 132.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 164.0 226.0 31.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 122.0 205.0 47.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 79.0 255.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 15.0 84.0 216.0 250.0 144.0 12.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 7.0 207.0 228.0 37.0 0.0 0.0 0.0 0.0 20.0 136.0 238.0 254.0 228.0 63.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 135.0 254.0 66.0 0.0 0.0 0.0 53.0 190.0 254.0 254.0 197.0 117.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 231.0 182.0 0.0 32.0 101.0 184.0 249.0 239.0 179.0 96.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 254.0 99.0 128.0 232.0 254.0 251.0 185.0 59.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 221.0 254.0 254.0 254.0 254.0 192.0 70.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 55.0 254.0 254.0 188.0 105.0 72.0 11.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 66.0 222.0 29.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 31.0 223.0 254.0 127.0 9.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 66.0 254.0 254.0 254.0 173.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 181.0 254.0 254.0 254.0 173.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 181.0 254.0 254.0 254.0 158.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 181.0 254.0 254.0 243.0 42.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 34.0 230.0 254.0 254.0 179.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 135.0 254.0 254.0 254.0 155.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 10.0 192.0 254.0 254.0 254.0 55.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 44.0 254.0 254.0 254.0 254.0 55.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 44.0 254.0 254.0 254.0 236.0 41.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 44.0 254.0 254.0 254.0 186.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 44.0 254.0 254.0 254.0 86.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 44.0 254.0 254.0 202.0 11.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 23.0 215.0 254.0 246.0 99.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 27.0 223.0 254.0 254.0 186.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 19.0 208.0 254.0 254.0 186.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 23.0 215.0 254.0 254.0 186.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 24.0 217.0 254.0 254.0 186.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 114.0 255.0 255.0 125.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 161.0 31.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 217.0 151.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 133.0 231.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 78.0 231.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 66.0 234.0 9.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 54.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 54.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 54.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 93.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 84.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 31.0 255.0 77.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 78.0 254.0 54.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 78.0 233.0 7.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 231.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 165.0 231.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 231.0 212.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 231.0 151.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 7.0 233.0 78.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 54.0 253.0 38.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 101.0 253.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 22.0 97.0 181.0 254.0 255.0 221.0 106.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 28.0 128.0 213.0 245.0 254.0 254.0 246.0 239.0 254.0 254.0 94.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 27.0 151.0 239.0 254.0 254.0 222.0 204.0 189.0 70.0 27.0 215.0 254.0 98.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 43.0 248.0 254.0 233.0 40.0 15.0 0.0 0.0 0.0 0.0 96.0 254.0 111.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 121.0 72.0 33.0 0.0 0.0 0.0 0.0 0.0 0.0 76.0 254.0 187.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 94.0 254.0 149.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 124.0 254.0 40.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 203.0 174.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 102.0 254.0 122.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 40.0 223.0 205.0 254.0 115.0 33.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 40.0 248.0 254.0 254.0 254.0 242.0 191.0 71.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 140.0 254.0 254.0 248.0 209.0 254.0 213.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 186.0 208.0 71.0 49.0 74.0 191.0 134.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 134.0 254.0 119.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 16.0 197.0 168.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 140.0 225.0 43.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 51.0 233.0 106.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 161.0 227.0 17.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 228.0 124.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 168.0 6.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 121.0 255.0 165.0 0.0 0.0 0.0 0.0 0.0 0.0 70.0 254.0 179.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 131.0 254.0 153.0 0.0 0.0 0.0 0.0 0.0 0.0 106.0 254.0 249.0 50.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 216.0 254.0 105.0 0.0 0.0 0.0 0.0 0.0 0.0 140.0 254.0 240.0 37.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 14.0 225.0 254.0 84.0 0.0 0.0 0.0 0.0 0.0 85.0 233.0 254.0 215.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 58.0 254.0 254.0 46.0 0.0 0.0 0.0 0.0 8.0 186.0 254.0 254.0 206.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 58.0 254.0 254.0 9.0 0.0 0.0 0.0 0.0 146.0 254.0 254.0 254.0 120.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 150.0 254.0 254.0 9.0 0.0 0.0 0.0 127.0 251.0 254.0 254.0 239.0 22.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 153.0 254.0 254.0 9.0 0.0 0.0 92.0 246.0 254.0 254.0 254.0 181.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 105.0 241.0 254.0 40.0 0.0 27.0 244.0 254.0 254.0 254.0 254.0 150.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 161.0 254.0 169.0 100.0 244.0 254.0 254.0 254.0 254.0 252.0 70.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 68.0 176.0 253.0 254.0 254.0 245.0 167.0 254.0 254.0 202.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 99.0 177.0 146.0 35.0 110.0 254.0 254.0 148.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 206.0 254.0 254.0 131.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 130.0 254.0 219.0 11.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 174.0 254.0 210.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 155.0 254.0 124.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 185.0 254.0 115.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 206.0 254.0 115.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 194.0 254.0 115.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 27.0 192.0 115.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 41.0 102.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 82.0 214.0 253.0 163.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 31.0 232.0 223.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 203.0 244.0 40.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 41.0 243.0 162.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 72.0 253.0 41.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 41.0 233.0 212.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 173.0 224.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 132.0 252.0 162.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 254.0 192.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 203.0 233.0 50.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 132.0 253.0 102.0 0.0 31.0 51.0 51.0 51.0 113.0 112.0 113.0 152.0 132.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 82.0 253.0 252.0 223.0 203.0 233.0 252.0 253.0 252.0 253.0 252.0 253.0 252.0 253.0 91.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 51.0 173.0 253.0 254.0 253.0 254.0 213.0 102.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 163.0 203.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 123.0 213.0 252.0 253.0 252.0 192.0 111.0 50.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 40.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 173.0 253.0 255.0 253.0 224.0 40.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 253.0 252.0 253.0 130.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 102.0 102.0 41.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 23.0 151.0 255.0 254.0 163.0 32.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 23.0 211.0 253.0 253.0 253.0 253.0 68.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 155.0 241.0 152.0 135.0 248.0 253.0 185.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 140.0 84.0 0.0 0.0 162.0 247.0 192.0 6.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 7.0 194.0 253.0 55.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 56.0 253.0 253.0 55.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 78.0 253.0 208.0 19.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 180.0 253.0 185.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 36.0 232.0 253.0 200.0 56.0 11.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 50.0 253.0 253.0 253.0 253.0 159.0 41.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 37.0 185.0 235.0 253.0 253.0 253.0 190.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 41.0 89.0 201.0 253.0 253.0 206.0 24.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 15.0 214.0 253.0 253.0 30.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 205.0 253.0 253.0 30.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 26.0 129.0 246.0 253.0 219.0 19.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 74.0 202.0 253.0 253.0 219.0 37.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 97.0 230.0 247.0 253.0 253.0 168.0 37.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 96.0 248.0 253.0 253.0 253.0 129.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 167.0 253.0 253.0 253.0 130.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 107.0 253.0 226.0 38.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 163.0 193.0 152.0 92.0 51.0 51.0 51.0 51.0 31.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 223.0 253.0 252.0 253.0 252.0 253.0 252.0 253.0 192.0 82.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 51.0 253.0 102.0 0.0 21.0 102.0 62.0 102.0 102.0 61.0 183.0 40.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 51.0 252.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 61.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 51.0 253.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 92.0 252.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 173.0 253.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 253.0 252.0 223.0 203.0 203.0 203.0 82.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 123.0 254.0 253.0 224.0 203.0 203.0 223.0 254.0 71.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 41.0 243.0 253.0 130.0 20.0 0.0 0.0 20.0 253.0 232.0 41.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 152.0 253.0 183.0 0.0 0.0 0.0 0.0 0.0 132.0 253.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 51.0 151.0 20.0 0.0 0.0 0.0 0.0 0.0 51.0 252.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 113.0 253.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 82.0 183.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 193.0 252.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 203.0 183.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 254.0 253.0 41.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 223.0 102.0 0.0 0.0 0.0 0.0 0.0 21.0 203.0 253.0 130.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 204.0 123.0 0.0 0.0 0.0 0.0 41.0 173.0 253.0 203.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 162.0 223.0 102.0 21.0 102.0 163.0 243.0 253.0 171.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 41.0 234.0 253.0 255.0 253.0 255.0 172.0 82.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 30.0 131.0 192.0 111.0 50.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 151.0 253.0 167.0 9.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 25.0 222.0 252.0 252.0 66.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 198.0 252.0 252.0 187.0 13.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 140.0 252.0 252.0 252.0 90.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 70.0 248.0 252.0 252.0 142.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 193.0 252.0 252.0 229.0 39.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 69.0 252.0 252.0 252.0 211.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 10.0 235.0 252.0 252.0 226.0 14.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 121.0 252.0 252.0 253.0 77.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 195.0 252.0 253.0 201.0 19.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 188.0 253.0 255.0 253.0 44.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 158.0 252.0 253.0 252.0 121.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 78.0 252.0 253.0 252.0 192.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 212.0 253.0 252.0 252.0 116.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 111.0 253.0 252.0 252.0 192.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 72.0 253.0 252.0 252.0 238.0 31.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 200.0 252.0 252.0 252.0 140.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 125.0 252.0 252.0 252.0 197.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 34.0 252.0 252.0 252.0 116.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 110.0 233.0 243.0 50.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 76.0 174.0 226.0 255.0 185.0 53.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 222.0 83.0 68.0 74.0 186.0 243.0 122.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 95.0 11.0 0.0 0.0 7.0 114.0 242.0 97.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 7.0 114.0 222.0 24.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 24.0 219.0 167.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 71.0 223.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 44.0 249.0 84.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 182.0 165.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 218.0 165.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 241.0 165.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 65.0 254.0 97.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 65.0 254.0 38.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 72.0 79.0 102.0 20.0 0.0 0.0 165.0 181.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 20.0 159.0 242.0 246.0 246.0 242.0 119.0 59.0 253.0 95.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 187.0 223.0 35.0 0.0 5.0 116.0 243.0 254.0 207.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 28.0 243.0 103.0 0.0 0.0 0.0 0.0 81.0 254.0 218.0 18.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 63.0 254.0 32.0 0.0 0.0 0.0 78.0 244.0 214.0 226.0 200.0 16.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 37.0 254.0 50.0 0.0 56.0 93.0 245.0 214.0 30.0 42.0 227.0 202.0 58.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 192.0 241.0 230.0 253.0 254.0 167.0 29.0 0.0 0.0 40.0 134.0 244.0 184.0 69.0 32.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 22.0 137.0 173.0 94.0 12.0 3.0 0.0 0.0 0.0 0.0 1.0 102.0 209.0 240.0 54.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 111.0 133.0 82.0 1.0 0.0 0.0 0.0 3.0 100.0 168.0 214.0 19.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 85.0 253.0 253.0 253.0 11.0 0.0 0.0 4.0 127.0 253.0 253.0 253.0 36.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 56.0 231.0 253.0 253.0 238.0 10.0 0.0 0.0 37.0 253.0 253.0 253.0 253.0 111.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 182.0 253.0 253.0 253.0 144.0 0.0 0.0 0.0 37.0 253.0 253.0 253.0 253.0 133.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 233.0 253.0 253.0 253.0 58.0 0.0 0.0 0.0 37.0 253.0 253.0 253.0 253.0 36.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 194.0 253.0 253.0 253.0 253.0 24.0 0.0 4.0 85.0 202.0 253.0 253.0 253.0 253.0 36.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 37.0 253.0 253.0 253.0 253.0 253.0 101.0 85.0 209.0 253.0 253.0 253.0 253.0 253.0 184.0 7.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 141.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 254.0 253.0 253.0 253.0 253.0 253.0 65.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 106.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 254.0 253.0 253.0 253.0 253.0 187.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 37.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 254.0 253.0 253.0 253.0 253.0 180.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 35.0 248.0 242.0 149.0 220.0 242.0 242.0 242.0 244.0 254.0 254.0 255.0 254.0 175.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 52.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 191.0 253.0 253.0 253.0 60.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 145.0 253.0 253.0 253.0 77.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 9.0 218.0 253.0 253.0 253.0 180.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 42.0 253.0 253.0 253.0 253.0 151.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 226.0 253.0 253.0 253.0 253.0 60.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 99.0 254.0 253.0 253.0 253.0 253.0 60.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 122.0 254.0 253.0 253.0 253.0 230.0 37.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 12.0 254.0 253.0 253.0 253.0 83.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 253.0 160.0 11.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 113.0 213.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 51.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 233.0 252.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 51.0 252.0 82.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 253.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 51.0 253.0 163.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 253.0 252.0 41.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 51.0 252.0 223.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 253.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 51.0 253.0 254.0 50.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 253.0 252.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 51.0 252.0 253.0 50.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 253.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 51.0 253.0 254.0 50.0 52.0 131.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 253.0 252.0 61.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 92.0 252.0 213.0 51.0 193.0 151.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 253.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 152.0 253.0 254.0 253.0 203.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 253.0 252.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 41.0 193.0 252.0 253.0 212.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 193.0 253.0 254.0 131.0 51.0 51.0 51.0 132.0 214.0 253.0 254.0 253.0 254.0 50.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 51.0 232.0 253.0 252.0 253.0 252.0 253.0 252.0 253.0 252.0 253.0 252.0 213.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 82.0 234.0 253.0 254.0 253.0 244.0 203.0 142.0 102.0 254.0 253.0 183.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 30.0 50.0 50.0 50.0 40.0 0.0 0.0 0.0 253.0 252.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 152.0 253.0 203.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 233.0 252.0 122.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 253.0 103.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 253.0 252.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 173.0 253.0 103.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 10.0 172.0 61.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 35.0 156.0 246.0 58.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 28.0 217.0 253.0 250.0 54.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 127.0 253.0 253.0 153.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 53.0 246.0 253.0 195.0 9.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 135.0 254.0 200.0 18.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 100.0 254.0 241.0 30.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 7.0 183.0 253.0 105.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 79.0 253.0 185.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 191.0 134.0 216.0 34.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 46.0 244.0 253.0 79.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 217.0 254.0 183.0 8.0 0.0 0.0 0.0 41.0 27.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 253.0 78.0 0.0 16.0 140.0 214.0 241.0 217.0 72.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 61.0 254.0 247.0 54.0 0.0 135.0 152.0 166.0 253.0 253.0 223.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 195.0 254.0 180.0 0.0 0.0 0.0 0.0 12.0 223.0 253.0 253.0 76.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 195.0 254.0 99.0 0.0 0.0 0.0 0.0 20.0 253.0 253.0 215.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 196.0 255.0 136.0 0.0 0.0 0.0 0.0 20.0 254.0 254.0 133.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 195.0 254.0 190.0 88.0 2.0 0.0 5.0 76.0 253.0 250.0 54.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 223.0 253.0 253.0 166.0 79.0 156.0 253.0 253.0 146.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 8.0 72.0 202.0 253.0 253.0 253.0 254.0 253.0 225.0 23.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 58.0 200.0 215.0 193.0 73.0 18.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 25.0 60.0 60.0 131.0 209.0 209.0 209.0 209.0 209.0 209.0 211.0 174.0 60.0 32.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 202.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 254.0 253.0 253.0 211.0 28.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 254.0 253.0 253.0 253.0 178.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 91.0 178.0 178.0 178.0 178.0 178.0 99.0 29.0 29.0 29.0 91.0 240.0 253.0 253.0 178.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 93.0 240.0 253.0 253.0 160.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 24.0 134.0 254.0 253.0 253.0 253.0 29.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 27.0 90.0 90.0 232.0 242.0 253.0 254.0 253.0 253.0 253.0 109.0 80.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 93.0 212.0 253.0 253.0 253.0 253.0 253.0 254.0 253.0 253.0 253.0 253.0 246.0 116.0 46.0 11.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 120.0 253.0 253.0 253.0 253.0 253.0 253.0 254.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 147.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 121.0 254.0 254.0 254.0 155.0 124.0 0.0 0.0 0.0 0.0 72.0 149.0 224.0 254.0 255.0 254.0 105.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 44.0 44.0 44.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 49.0 225.0 253.0 253.0 139.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 48.0 244.0 253.0 253.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 72.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 246.0 253.0 182.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 67.0 241.0 145.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 72.0 240.0 253.0 253.0 104.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 75.0 253.0 253.0 183.0 179.0 179.0 119.0 66.0 179.0 179.0 179.0 232.0 253.0 242.0 196.0 31.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 36.0 214.0 253.0 253.0 253.0 253.0 254.0 253.0 253.0 253.0 253.0 253.0 253.0 163.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 10.0 94.0 163.0 179.0 200.0 255.0 253.0 253.0 253.0 226.0 163.0 163.0 17.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 24.0 59.0 95.0 111.0 59.0 42.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 9.0 77.0 50.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 63.0 119.0 171.0 242.0 243.0 202.0 98.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 49.0 21.0 0.0 24.0 119.0 204.0 254.0 255.0 227.0 128.0 107.0 7.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 30.0 187.0 254.0 232.0 215.0 234.0 254.0 241.0 159.0 74.0 18.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 18.0 217.0 254.0 254.0 254.0 251.0 221.0 105.0 34.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 18.0 199.0 254.0 254.0 249.0 162.0 66.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 187.0 254.0 254.0 196.0 31.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 57.0 240.0 254.0 163.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 222.0 254.0 161.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 34.0 242.0 248.0 76.0 34.0 107.0 134.0 218.0 177.0 93.0 26.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 117.0 254.0 248.0 241.0 243.0 254.0 235.0 223.0 240.0 254.0 236.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 198.0 254.0 254.0 201.0 144.0 58.0 22.0 0.0 31.0 142.0 250.0 233.0 104.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 18.0 151.0 85.0 15.0 0.0 0.0 0.0 0.0 0.0 0.0 132.0 254.0 175.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 108.0 254.0 254.0 9.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 33.0 209.0 254.0 176.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 228.0 254.0 233.0 45.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 14.0 98.0 182.0 250.0 254.0 231.0 79.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 28.0 27.0 27.0 103.0 117.0 151.0 222.0 254.0 254.0 240.0 142.0 28.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 242.0 249.0 250.0 253.0 247.0 245.0 241.0 184.0 100.0 30.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 46.0 49.0 65.0 34.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 38.0 154.0 215.0 241.0 77.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 81.0 233.0 177.0 70.0 23.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 52.0 146.0 146.0 149.0 177.0 224.0 115.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 221.0 207.0 161.0 184.0 106.0 43.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 248.0 62.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 53.0 252.0 62.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 68.0 253.0 62.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 146.0 254.0 62.0 0.0 0.0 4.0 31.0 13.0 32.0 55.0 31.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 107.0 254.0 62.0 14.0 83.0 214.0 254.0 226.0 254.0 254.0 254.0 181.0 65.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 70.0 254.0 154.0 225.0 251.0 167.0 84.0 70.0 23.0 23.0 91.0 179.0 250.0 105.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 22.0 204.0 220.0 154.0 33.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 110.0 255.0 53.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 9.0 210.0 230.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 95.0 250.0 40.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 62.0 254.0 69.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 74.0 248.0 17.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 181.0 246.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 31.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 18.0 229.0 192.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 14.0 236.0 78.0 2.0 0.0 0.0 0.0 0.0 0.0 18.0 161.0 233.0 185.0 9.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 114.0 254.0 90.0 32.0 12.0 55.0 85.0 168.0 234.0 234.0 129.0 7.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 130.0 226.0 244.0 236.0 254.0 247.0 176.0 109.0 40.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 16.0 206.0 217.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 17.0 205.0 253.0 216.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 17.0 205.0 253.0 251.0 139.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 136.0 253.0 253.0 149.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 20.0 208.0 253.0 238.0 39.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 209.0 253.0 253.0 149.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 253.0 241.0 36.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 253.0 235.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 38.0 50.0 50.0 50.0 50.0 50.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 253.0 235.0 0.0 0.0 0.0 0.0 0.0 68.0 180.0 236.0 253.0 253.0 253.0 253.0 253.0 187.0 126.0 30.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 253.0 235.0 0.0 0.0 0.0 0.0 13.0 198.0 253.0 253.0 204.0 191.0 148.0 128.0 176.0 247.0 253.0 222.0 126.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 253.0 140.0 0.0 0.0 0.0 0.0 144.0 253.0 253.0 168.0 14.0 0.0 0.0 0.0 0.0 108.0 215.0 253.0 253.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 253.0 208.0 0.0 0.0 0.0 0.0 174.0 253.0 253.0 61.0 0.0 0.0 0.0 0.0 0.0 0.0 112.0 253.0 253.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 253.0 235.0 0.0 0.0 0.0 0.0 174.0 253.0 253.0 61.0 0.0 0.0 0.0 0.0 0.0 0.0 112.0 253.0 214.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 253.0 241.0 36.0 0.0 0.0 0.0 174.0 253.0 253.0 164.0 0.0 0.0 0.0 0.0 0.0 0.0 112.0 253.0 87.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 103.0 253.0 253.0 232.0 85.0 0.0 0.0 25.0 125.0 229.0 244.0 181.0 64.0 0.0 0.0 0.0 0.0 157.0 253.0 112.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 207.0 253.0 253.0 208.0 0.0 0.0 0.0 0.0 114.0 229.0 253.0 244.0 87.0 0.0 0.0 42.0 243.0 253.0 81.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 25.0 253.0 253.0 250.0 150.0 36.0 0.0 0.0 0.0 52.0 148.0 181.0 245.0 184.0 106.0 228.0 253.0 95.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 88.0 207.0 253.0 253.0 242.0 211.0 112.0 112.0 112.0 112.0 118.0 172.0 253.0 253.0 207.0 26.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 80.0 135.0 210.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 213.0 135.0 87.0 7.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 27.0 129.0 129.0 129.0 129.0 129.0 129.0 25.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 10.0 29.0 4.0 104.0 229.0 253.0 129.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 85.0 252.0 179.0 252.0 252.0 252.0 253.0 122.0 13.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 123.0 252.0 253.0 252.0 148.0 56.0 253.0 252.0 143.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 51.0 246.0 252.0 253.0 102.0 6.0 0.0 153.0 252.0 168.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 170.0 253.0 253.0 255.0 84.0 0.0 0.0 13.0 207.0 253.0 91.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 169.0 252.0 252.0 247.0 65.0 0.0 0.0 0.0 169.0 252.0 215.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 169.0 252.0 252.0 100.0 0.0 0.0 0.0 0.0 82.0 252.0 252.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 26.0 243.0 252.0 252.0 0.0 0.0 0.0 0.0 0.0 57.0 252.0 252.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 41.0 253.0 253.0 253.0 0.0 0.0 0.0 0.0 0.0 57.0 253.0 253.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 141.0 252.0 252.0 252.0 0.0 0.0 0.0 0.0 0.0 57.0 252.0 252.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 229.0 252.0 224.0 168.0 0.0 0.0 0.0 0.0 0.0 57.0 252.0 252.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 253.0 252.0 168.0 0.0 0.0 0.0 0.0 0.0 0.0 57.0 252.0 252.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 253.0 168.0 0.0 0.0 0.0 0.0 0.0 0.0 120.0 253.0 190.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 253.0 252.0 93.0 0.0 0.0 0.0 0.0 0.0 0.0 169.0 252.0 65.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 253.0 252.0 56.0 0.0 0.0 0.0 0.0 0.0 10.0 197.0 252.0 28.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 253.0 252.0 156.0 0.0 0.0 0.0 0.0 0.0 179.0 252.0 177.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 179.0 253.0 178.0 16.0 0.0 19.0 66.0 191.0 254.0 209.0 25.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 22.0 234.0 252.0 215.0 169.0 225.0 252.0 252.0 209.0 28.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 131.0 252.0 252.0 253.0 252.0 252.0 214.0 25.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 7.0 65.0 240.0 253.0 177.0 103.0 15.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 92.0 253.0 141.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 19.0 196.0 252.0 241.0 24.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 147.0 225.0 97.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 57.0 252.0 252.0 253.0 27.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 32.0 253.0 252.0 195.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 57.0 252.0 252.0 178.0 9.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 140.0 253.0 252.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 57.0 252.0 252.0 140.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 16.0 203.0 253.0 252.0 55.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 120.0 253.0 253.0 141.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 29.0 253.0 255.0 215.0 31.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 197.0 252.0 252.0 140.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 29.0 252.0 253.0 42.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 197.0 252.0 252.0 31.0 0.0 0.0 0.0 0.0 0.0 0.0 13.0 79.0 252.0 253.0 27.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 57.0 234.0 252.0 236.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 57.0 252.0 252.0 178.0 9.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 85.0 252.0 252.0 189.0 141.0 140.0 140.0 140.0 140.0 79.0 48.0 165.0 252.0 252.0 140.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 86.0 253.0 253.0 253.0 255.0 253.0 253.0 253.0 253.0 255.0 253.0 253.0 253.0 253.0 141.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 57.0 233.0 252.0 252.0 253.0 252.0 252.0 242.0 214.0 215.0 243.0 252.0 252.0 252.0 140.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 75.0 195.0 195.0 56.0 55.0 55.0 49.0 31.0 31.0 50.0 209.0 252.0 220.0 31.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 73.0 234.0 252.0 112.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 225.0 252.0 252.0 112.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 226.0 253.0 253.0 112.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 101.0 249.0 252.0 242.0 74.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 113.0 252.0 252.0 246.0 88.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 38.0 234.0 252.0 154.0 99.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 146.0 252.0 84.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 77.0 254.0 103.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 203.0 253.0 217.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 253.0 199.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 253.0 96.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 247.0 73.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 35.0 254.0 229.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 162.0 254.0 130.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 242.0 254.0 109.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 100.0 252.0 243.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 110.0 253.0 127.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 116.0 254.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 10.0 232.0 253.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 98.0 253.0 236.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 178.0 253.0 110.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 218.0 253.0 11.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 218.0 170.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 29.0 230.0 144.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 85.0 253.0 144.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 8.0 221.0 144.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 160.0 196.0 6.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 27.0 73.0 157.0 163.0 195.0 163.0 27.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 60.0 184.0 242.0 254.0 253.0 253.0 253.0 253.0 158.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 50.0 179.0 248.0 253.0 253.0 217.0 197.0 127.0 165.0 242.0 254.0 63.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 116.0 234.0 253.0 250.0 163.0 80.0 0.0 0.0 0.0 0.0 181.0 254.0 108.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 116.0 253.0 254.0 214.0 62.0 0.0 0.0 0.0 0.0 0.0 0.0 181.0 254.0 160.0 13.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 95.0 254.0 254.0 182.0 7.0 0.0 0.0 0.0 0.0 0.0 0.0 38.0 228.0 255.0 254.0 127.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 253.0 201.0 7.0 0.0 0.0 0.0 0.0 0.0 32.0 55.0 172.0 253.0 254.0 253.0 42.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 253.0 207.0 69.0 37.0 32.0 16.0 102.0 186.0 238.0 253.0 253.0 253.0 254.0 160.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 86.0 249.0 253.0 254.0 253.0 245.0 222.0 253.0 254.0 253.0 253.0 253.0 253.0 254.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 96.0 227.0 254.0 253.0 253.0 253.0 220.0 136.0 72.0 105.0 214.0 253.0 228.0 12.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 59.0 91.0 46.0 0.0 0.0 0.0 0.0 63.0 254.0 254.0 92.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 179.0 253.0 201.0 7.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 28.0 235.0 253.0 85.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 127.0 253.0 238.0 16.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 145.0 253.0 202.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 47.0 241.0 254.0 144.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 182.0 253.0 245.0 81.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 46.0 254.0 253.0 138.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 155.0 254.0 223.0 72.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 59.0 195.0 70.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 8.0 123.0 162.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 84.0 103.0 202.0 225.0 85.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 18.0 40.0 171.0 223.0 240.0 236.0 74.0 58.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 49.0 64.0 134.0 240.0 255.0 253.0 161.0 57.0 14.0 36.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 98.0 212.0 213.0 243.0 253.0 253.0 253.0 192.0 68.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 160.0 230.0 231.0 230.0 159.0 80.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 36.0 84.0 121.0 27.0 27.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 43.0 126.0 94.0 57.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 85.0 202.0 48.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 14.0 237.0 243.0 35.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 36.0 180.0 255.0 210.0 193.0 37.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 32.0 63.0 63.0 183.0 142.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 149.0 204.0 9.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 225.0 14.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 94.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 220.0 11.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 22.0 173.0 254.0 63.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 125.0 253.0 224.0 32.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 22.0 253.0 200.0 36.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 130.0 7.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 191.0 255.0 128.0 128.0 128.0 64.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 255.0 255.0 255.0 255.0 255.0 255.0 255.0 255.0 255.0 255.0 128.0 128.0 64.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 255.0 255.0 255.0 255.0 255.0 255.0 255.0 255.0 255.0 255.0 255.0 255.0 255.0 191.0 64.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 64.0 128.0 128.0 128.0 128.0 255.0 255.0 255.0 255.0 255.0 255.0 255.0 255.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 191.0 255.0 255.0 255.0 255.0 255.0 64.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 255.0 255.0 255.0 255.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 255.0 255.0 255.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 255.0 255.0 255.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 255.0 255.0 255.0 64.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 255.0 255.0 255.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 255.0 255.0 255.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 255.0 255.0 191.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 191.0 255.0 255.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 255.0 255.0 255.0 64.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 255.0 255.0 191.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 255.0 255.0 64.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 191.0 255.0 255.0 255.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 255.0 255.0 255.0 191.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 255.0 255.0 191.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 255.0 255.0 64.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 43.0 47.0 47.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 9.0 108.0 249.0 253.0 253.0 208.0 207.0 207.0 207.0 149.0 65.0 13.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 9.0 184.0 254.0 253.0 253.0 253.0 254.0 253.0 253.0 253.0 254.0 253.0 213.0 25.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 55.0 203.0 254.0 254.0 199.0 127.0 127.0 60.0 93.0 84.0 68.0 151.0 222.0 254.0 161.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 138.0 253.0 253.0 199.0 19.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 155.0 253.0 211.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 138.0 253.0 253.0 17.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 74.0 241.0 253.0 211.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 105.0 253.0 253.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 34.0 229.0 253.0 253.0 160.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 149.0 254.0 229.0 40.0 0.0 0.0 0.0 38.0 153.0 254.0 254.0 254.0 180.0 25.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 19.0 198.0 254.0 207.0 9.0 34.0 72.0 235.0 253.0 253.0 224.0 139.0 13.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 17.0 211.0 253.0 215.0 240.0 254.0 253.0 234.0 128.0 17.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 102.0 229.0 253.0 253.0 253.0 228.0 77.0 13.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 70.0 170.0 254.0 254.0 254.0 254.0 254.0 254.0 119.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 26.0 130.0 230.0 254.0 253.0 253.0 185.0 115.0 64.0 211.0 253.0 248.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 166.0 232.0 253.0 253.0 247.0 162.0 46.0 13.0 7.0 91.0 245.0 253.0 254.0 56.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 253.0 253.0 253.0 210.0 93.0 127.0 159.0 204.0 253.0 253.0 253.0 228.0 15.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 134.0 241.0 254.0 255.0 254.0 254.0 254.0 254.0 254.0 254.0 228.0 34.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 27.0 115.0 140.0 206.0 206.0 206.0 207.0 206.0 123.0 15.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 142.0 254.0 204.0 172.0 199.0 140.0 91.0 27.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 68.0 222.0 81.0 74.0 153.0 185.0 237.0 237.0 250.0 194.0 29.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 166.0 196.0 0.0 0.0 0.0 0.0 0.0 0.0 115.0 81.0 11.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 213.0 159.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 7.0 220.0 115.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 34.0 246.0 130.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 168.0 246.0 21.0 0.0 0.0 0.0 0.0 138.0 69.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 131.0 254.0 99.0 0.0 0.0 0.0 0.0 189.0 139.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 82.0 254.0 107.0 0.0 0.0 0.0 85.0 229.0 89.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 196.0 228.0 11.0 0.0 0.0 154.0 254.0 57.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 110.0 254.0 129.0 1.0 9.0 207.0 255.0 57.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 193.0 254.0 183.0 188.0 175.0 254.0 57.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 17.0 116.0 147.0 22.0 146.0 254.0 57.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 99.0 254.0 57.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 99.0 254.0 57.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 167.0 254.0 57.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 135.0 232.0 8.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 99.0 251.0 52.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 99.0 246.0 41.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 126.0 229.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 55.0 192.0 87.0 11.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 169.0 252.0 253.0 170.0 43.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 111.0 249.0 253.0 252.0 233.0 101.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 115.0 227.0 252.0 252.0 252.0 138.0 27.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 87.0 112.0 147.0 252.0 252.0 150.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 9.0 132.0 247.0 255.0 125.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 176.0 253.0 196.0 7.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 9.0 253.0 252.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 98.0 253.0 252.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 9.0 132.0 246.0 253.0 182.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 146.0 253.0 227.0 148.0 131.0 123.0 201.0 253.0 253.0 212.0 27.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 155.0 252.0 252.0 252.0 253.0 252.0 252.0 231.0 124.0 27.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 7.0 74.0 126.0 214.0 236.0 252.0 252.0 145.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 14.0 140.0 252.0 231.0 28.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 50.0 244.0 252.0 42.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 124.0 62.0 0.0 0.0 0.0 0.0 0.0 50.0 245.0 253.0 42.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 84.0 242.0 27.0 0.0 0.0 0.0 36.0 146.0 211.0 252.0 252.0 42.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 176.0 252.0 22.0 22.0 31.0 127.0 223.0 253.0 252.0 242.0 134.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 22.0 252.0 252.0 253.0 252.0 252.0 252.0 252.0 190.0 110.0 42.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 182.0 252.0 253.0 252.0 155.0 147.0 59.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 68.0 197.0 255.0 242.0 145.0 236.0 212.0 169.0 130.0 130.0 130.0 95.0 107.0 130.0 85.0 116.0 70.0 76.0 7.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 125.0 248.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 12.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 60.0 111.0 111.0 111.0 111.0 111.0 111.0 138.0 235.0 235.0 235.0 241.0 238.0 241.0 253.0 253.0 253.0 253.0 60.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 34.0 18.0 48.0 239.0 253.0 242.0 170.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 109.0 253.0 253.0 141.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 74.0 240.0 253.0 219.0 60.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 47.0 86.0 44.0 44.0 44.0 11.0 0.0 75.0 239.0 253.0 236.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 22.0 224.0 253.0 253.0 253.0 253.0 193.0 174.0 238.0 253.0 253.0 173.0 50.0 28.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 25.0 206.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 221.0 180.0 31.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 10.0 68.0 128.0 155.0 237.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 99.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 43.0 237.0 253.0 253.0 198.0 142.0 61.0 61.0 61.0 61.0 61.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 15.0 175.0 253.0 253.0 158.0 11.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 150.0 253.0 253.0 98.0 11.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 79.0 240.0 253.0 159.0 11.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 33.0 241.0 253.0 205.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 87.0 253.0 234.0 60.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 81.0 245.0 253.0 92.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 79.0 247.0 253.0 234.0 45.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 18.0 249.0 253.0 236.0 52.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 19.0 253.0 253.0 155.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 219.0 81.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 218.0 144.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 19.0 121.0 11.0 0.0 0.0 218.0 144.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 37.0 254.0 72.0 0.0 0.0 218.0 144.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 37.0 254.0 72.0 0.0 0.0 218.0 144.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 102.0 254.0 99.0 0.0 0.0 193.0 171.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 140.0 254.0 79.0 0.0 0.0 128.0 235.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 8.0 223.0 251.0 62.0 0.0 0.0 128.0 235.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 132.0 254.0 250.0 135.0 110.0 110.0 214.0 164.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 236.0 254.0 254.0 254.0 255.0 254.0 254.0 144.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 237.0 254.0 197.0 85.0 59.0 59.0 232.0 145.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 185.0 76.0 4.0 0.0 0.0 32.0 238.0 144.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 36.0 241.0 144.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 55.0 254.0 144.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 55.0 254.0 144.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 81.0 254.0 87.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 145.0 254.0 54.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 145.0 254.0 54.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 145.0 225.0 12.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 114.0 120.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 101.0 147.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 40.0 252.0 175.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 213.0 252.0 132.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 147.0 250.0 143.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 80.0 252.0 98.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 165.0 221.0 14.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 20.0 19.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 74.0 243.0 110.0 0.0 0.0 0.0 0.0 0.0 0.0 10.0 127.0 236.0 236.0 173.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 151.0 197.0 0.0 0.0 0.0 0.0 0.0 0.0 60.0 236.0 252.0 252.0 252.0 248.0 61.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 242.0 163.0 0.0 0.0 0.0 0.0 0.0 11.0 199.0 252.0 168.0 66.0 212.0 249.0 69.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 44.0 227.0 12.0 0.0 0.0 0.0 0.0 0.0 177.0 252.0 166.0 2.0 0.0 198.0 241.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 162.0 217.0 0.0 0.0 0.0 0.0 0.0 63.0 255.0 201.0 19.0 0.0 0.0 151.0 242.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 209.0 149.0 0.0 0.0 0.0 0.0 0.0 187.0 253.0 77.0 0.0 0.0 0.0 198.0 164.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 209.0 187.0 0.0 0.0 0.0 0.0 0.0 220.0 226.0 13.0 0.0 0.0 46.0 243.0 131.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 209.0 121.0 0.0 0.0 0.0 0.0 41.0 237.0 211.0 0.0 0.0 12.0 206.0 252.0 26.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 209.0 192.0 0.0 0.0 0.0 0.0 78.0 252.0 111.0 0.0 0.0 119.0 252.0 170.0 8.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 209.0 230.0 0.0 0.0 0.0 0.0 78.0 252.0 111.0 0.0 79.0 250.0 252.0 55.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 105.0 250.0 132.0 0.0 0.0 0.0 78.0 252.0 164.0 40.0 221.0 237.0 60.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 175.0 231.0 154.0 13.0 0.0 97.0 252.0 253.0 252.0 252.0 121.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 92.0 226.0 252.0 193.0 187.0 236.0 252.0 253.0 252.0 252.0 87.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 46.0 142.0 243.0 252.0 219.0 142.0 157.0 223.0 100.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 13.0 183.0 255.0 46.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 89.0 136.0 253.0 232.0 29.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 101.0 238.0 253.0 248.0 46.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 9.0 84.0 45.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 205.0 253.0 231.0 79.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 54.0 185.0 246.0 78.0 0.0 0.0 0.0 0.0 0.0 0.0 85.0 86.0 230.0 186.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 26.0 233.0 163.0 55.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 63.0 156.0 231.0 57.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 135.0 142.0 208.0 23.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 214.0 253.0 141.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 47.0 253.0 253.0 67.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 59.0 223.0 253.0 129.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 47.0 253.0 253.0 67.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 51.0 188.0 253.0 85.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 69.0 253.0 253.0 147.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 47.0 38.0 239.0 205.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 68.0 253.0 253.0 253.0 196.0 99.0 12.0 0.0 0.0 61.0 59.0 187.0 215.0 251.0 175.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 124.0 252.0 253.0 253.0 253.0 250.0 249.0 249.0 252.0 252.0 253.0 253.0 253.0 158.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 117.0 194.0 253.0 253.0 253.0 253.0 253.0 235.0 199.0 253.0 253.0 170.0 47.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 26.0 148.0 125.0 15.0 15.0 12.0 6.0 54.0 253.0 184.0 39.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 12.0 177.0 253.0 72.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 139.0 237.0 253.0 72.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 194.0 253.0 232.0 24.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 203.0 186.0 133.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 249.0 167.0 92.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 130.0 12.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 128.0 128.0 128.0 255.0 128.0 255.0 191.0 128.0 64.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 255.0 255.0 191.0 255.0 255.0 255.0 255.0 255.0 255.0 255.0 64.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 255.0 255.0 255.0 255.0 255.0 255.0 255.0 255.0 255.0 255.0 255.0 64.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 128.0 128.0 128.0 128.0 64.0 0.0 128.0 191.0 255.0 255.0 255.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 255.0 255.0 255.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 128.0 128.0 191.0 255.0 255.0 255.0 64.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 255.0 255.0 255.0 255.0 255.0 255.0 191.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 255.0 255.0 255.0 255.0 255.0 255.0 191.0 64.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 255.0 255.0 255.0 255.0 255.0 255.0 255.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 255.0 255.0 255.0 255.0 255.0 255.0 255.0 191.0 64.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 191.0 255.0 255.0 255.0 255.0 255.0 255.0 255.0 255.0 191.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 128.0 128.0 128.0 128.0 255.0 255.0 255.0 255.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 255.0 255.0 255.0 191.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 255.0 255.0 255.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 0.0 0.0 0.0 0.0 255.0 255.0 255.0 255.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 255.0 191.0 0.0 64.0 255.0 255.0 255.0 255.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 191.0 255.0 255.0 191.0 255.0 255.0 255.0 255.0 255.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 255.0 255.0 255.0 255.0 255.0 255.0 255.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 255.0 255.0 255.0 255.0 255.0 255.0 64.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 191.0 255.0 255.0 255.0 128.0 64.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 14.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 111.0 217.0 232.0 132.0 57.0 92.0 92.0 92.0 92.0 43.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 159.0 252.0 254.0 254.0 254.0 252.0 254.0 254.0 254.0 254.0 251.0 137.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 37.0 205.0 254.0 254.0 254.0 254.0 254.0 234.0 200.0 133.0 133.0 197.0 242.0 254.0 178.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 32.0 224.0 254.0 224.0 200.0 124.0 138.0 200.0 32.0 0.0 0.0 0.0 0.0 38.0 180.0 254.0 129.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 17.0 223.0 254.0 239.0 33.0 4.0 0.0 0.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 8.0 235.0 240.0 113.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 119.0 254.0 249.0 67.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 84.0 254.0 254.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 63.0 254.0 254.0 98.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 68.0 254.0 254.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 208.0 254.0 236.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 68.0 254.0 254.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 252.0 117.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 73.0 254.0 248.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 244.0 46.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 254.0 194.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 254.0 67.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 247.0 254.0 141.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 254.0 74.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 76.0 222.0 254.0 232.0 36.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 163.0 254.0 254.0 95.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 40.0 113.0 192.0 254.0 254.0 207.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 30.0 222.0 254.0 248.0 185.0 134.0 99.0 62.0 134.0 134.0 134.0 200.0 243.0 254.0 254.0 233.0 139.0 9.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 28.0 162.0 252.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 248.0 126.0 27.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 55.0 172.0 186.0 186.0 212.0 186.0 186.0 186.0 122.0 91.0 53.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 16.0 13.0 13.0 44.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 222.0 251.0 251.0 251.0 229.0 244.0 251.0 251.0 252.0 207.0 208.0 241.0 234.0 183.0 128.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 181.0 253.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 249.0 183.0 160.0 100.0 24.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 12.0 13.0 13.0 13.0 13.0 13.0 13.0 88.0 99.0 141.0 115.0 138.0 239.0 254.0 254.0 254.0 254.0 255.0 106.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 13.0 54.0 168.0 237.0 254.0 254.0 249.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 54.0 237.0 254.0 254.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 27.0 223.0 254.0 176.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 146.0 255.0 254.0 105.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 42.0 222.0 254.0 159.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 26.0 223.0 254.0 238.0 65.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 27.0 210.0 254.0 253.0 77.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 191.0 254.0 252.0 92.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 139.0 254.0 254.0 187.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 75.0 243.0 254.0 190.0 14.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 24.0 228.0 254.0 229.0 35.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 24.0 208.0 254.0 254.0 56.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 195.0 254.0 254.0 135.0 15.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 110.0 254.0 254.0 165.0 15.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 193.0 254.0 178.0 31.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 43.0 68.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 86.0 254.0 254.0 254.0 254.0 135.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 90.0 250.0 253.0 253.0 253.0 253.0 252.0 248.0 160.0 118.0 45.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 216.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 232.0 103.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 144.0 251.0 253.0 253.0 224.0 48.0 49.0 170.0 253.0 253.0 253.0 253.0 234.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 95.0 251.0 253.0 253.0 182.0 18.0 0.0 0.0 6.0 49.0 170.0 253.0 253.0 251.0 149.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 88.0 225.0 253.0 253.0 253.0 61.0 0.0 0.0 0.0 0.0 0.0 26.0 221.0 253.0 253.0 245.0 42.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 40.0 245.0 253.0 253.0 253.0 137.0 7.0 0.0 0.0 0.0 0.0 0.0 0.0 42.0 221.0 253.0 253.0 117.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 118.0 253.0 253.0 253.0 225.0 27.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 156.0 253.0 253.0 117.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 118.0 253.0 253.0 253.0 58.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 156.0 253.0 253.0 117.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 151.0 253.0 253.0 177.0 8.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 156.0 253.0 253.0 217.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 248.0 253.0 253.0 58.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 156.0 253.0 253.0 247.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 154.0 253.0 253.0 120.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 156.0 253.0 253.0 220.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 208.0 253.0 253.0 155.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 174.0 253.0 253.0 117.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 160.0 253.0 253.0 155.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 7.0 134.0 253.0 253.0 253.0 117.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 118.0 253.0 253.0 155.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 67.0 253.0 253.0 253.0 252.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 45.0 246.0 253.0 216.0 33.0 0.0 0.0 0.0 0.0 7.0 27.0 134.0 253.0 253.0 253.0 251.0 148.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 241.0 253.0 253.0 216.0 40.0 128.0 150.0 150.0 174.0 253.0 253.0 253.0 253.0 251.0 215.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 105.0 243.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 153.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 229.0 253.0 253.0 253.0 250.0 253.0 253.0 221.0 210.0 156.0 183.0 117.0 45.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 161.0 139.0 234.0 83.0 123.0 123.0 95.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 47.0 136.0 241.0 254.0 254.0 254.0 254.0 254.0 255.0 202.0 130.0 8.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 33.0 228.0 253.0 253.0 253.0 253.0 231.0 135.0 191.0 218.0 234.0 253.0 195.0 54.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 43.0 240.0 253.0 253.0 252.0 189.0 31.0 0.0 0.0 0.0 37.0 145.0 253.0 178.0 15.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 82.0 182.0 182.0 68.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 141.0 253.0 158.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 182.0 241.0 85.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 117.0 253.0 170.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 48.0 253.0 170.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 48.0 253.0 170.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 123.0 253.0 170.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 166.0 253.0 88.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 10.0 192.0 203.0 12.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 114.0 253.0 188.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 12.0 253.0 253.0 81.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 54.0 130.0 17.0 6.0 0.0 0.0 0.0 0.0 6.0 189.0 253.0 146.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 32.0 177.0 253.0 253.0 253.0 194.0 148.0 121.0 7.0 0.0 127.0 253.0 236.0 37.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 24.0 184.0 253.0 215.0 102.0 201.0 210.0 253.0 253.0 186.0 166.0 246.0 251.0 127.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 36.0 253.0 202.0 13.0 0.0 0.0 7.0 90.0 234.0 253.0 253.0 253.0 241.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 36.0 253.0 239.0 105.0 10.0 0.0 47.0 157.0 238.0 253.0 253.0 253.0 251.0 132.0 29.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 22.0 174.0 253.0 253.0 223.0 219.0 238.0 253.0 253.0 223.0 54.0 88.0 251.0 253.0 134.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 50.0 232.0 253.0 253.0 253.0 234.0 108.0 12.0 0.0 0.0 83.0 253.0 250.0 121.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 45.0 154.0 208.0 248.0 230.0 254.0 255.0 138.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 40.0 205.0 254.0 254.0 254.0 254.0 254.0 254.0 213.0 31.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 17.0 210.0 254.0 254.0 254.0 254.0 236.0 254.0 254.0 254.0 125.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 98.0 254.0 254.0 254.0 152.0 40.0 26.0 151.0 254.0 254.0 168.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 166.0 254.0 254.0 202.0 44.0 0.0 10.0 207.0 254.0 254.0 205.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 53.0 252.0 254.0 242.0 83.0 136.0 180.0 254.0 254.0 254.0 125.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 189.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 63.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 56.0 209.0 254.0 254.0 254.0 254.0 254.0 201.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 88.0 228.0 254.0 254.0 254.0 238.0 92.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 103.0 248.0 254.0 254.0 254.0 61.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 91.0 248.0 254.0 254.0 253.0 166.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 100.0 230.0 254.0 254.0 170.0 113.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 95.0 253.0 254.0 254.0 229.0 16.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 95.0 227.0 254.0 254.0 254.0 133.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 38.0 228.0 254.0 254.0 254.0 202.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 193.0 254.0 254.0 254.0 202.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 91.0 246.0 254.0 254.0 242.0 90.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 35.0 242.0 254.0 254.0 254.0 141.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 214.0 254.0 254.0 185.0 23.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 183.0 254.0 247.0 24.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 23.0 219.0 255.0 105.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 42.0 253.0 253.0 158.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 67.0 253.0 253.0 158.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 160.0 253.0 253.0 158.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 160.0 253.0 253.0 158.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 160.0 253.0 253.0 158.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 160.0 253.0 253.0 158.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 160.0 253.0 253.0 158.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 86.0 253.0 253.0 218.0 15.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 42.0 253.0 253.0 253.0 23.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 42.0 253.0 253.0 253.0 23.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 42.0 253.0 253.0 253.0 23.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 42.0 253.0 253.0 253.0 23.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 42.0 253.0 253.0 205.0 11.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 42.0 253.0 253.0 158.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 253.0 253.0 158.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 12.0 203.0 253.0 253.0 74.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 160.0 253.0 192.0 9.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 241.0 253.0 176.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 111.0 170.0 149.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 38.0 226.0 214.0 19.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 14.0 25.0 25.0 19.0 0.0 0.0 0.0 11.0 25.0 13.0 25.0 25.0 48.0 223.0 253.0 245.0 32.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 145.0 253.0 253.0 230.0 65.0 135.0 157.0 199.0 253.0 209.0 253.0 253.0 253.0 253.0 253.0 151.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 118.0 212.0 221.0 205.0 219.0 230.0 253.0 253.0 253.0 254.0 253.0 253.0 253.0 253.0 181.0 16.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 24.0 0.0 21.0 38.0 72.0 72.0 72.0 72.0 72.0 184.0 253.0 239.0 46.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 7.0 185.0 253.0 101.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 124.0 253.0 253.0 72.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 145.0 253.0 235.0 45.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 95.0 110.0 110.0 110.0 192.0 253.0 249.0 143.0 110.0 110.0 167.0 63.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 82.0 252.0 253.0 253.0 254.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 87.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 105.0 231.0 242.0 244.0 254.0 254.0 246.0 184.0 149.0 81.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 13.0 253.0 250.0 76.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 13.0 253.0 217.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 94.0 253.0 217.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 133.0 253.0 217.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 226.0 253.0 182.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 253.0 96.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 253.0 96.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 253.0 96.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 81.0 242.0 51.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 54.0 175.0 230.0 254.0 132.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 66.0 236.0 209.0 245.0 254.0 242.0 59.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 41.0 236.0 206.0 53.0 33.0 147.0 254.0 150.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 181.0 218.0 8.0 0.0 0.0 32.0 242.0 113.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 72.0 105.0 2.0 0.0 0.0 32.0 236.0 75.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 16.0 160.0 222.0 80.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 10.0 215.0 254.0 151.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 62.0 217.0 254.0 173.0 24.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 8.0 143.0 250.0 254.0 245.0 44.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 131.0 254.0 254.0 254.0 254.0 192.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 45.0 224.0 239.0 164.0 229.0 151.0 175.0 126.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 28.0 228.0 254.0 170.0 45.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 9.0 148.0 254.0 134.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 8.0 220.0 179.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 184.0 239.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 254.0 154.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 35.0 10.0 0.0 0.0 0.0 0.0 0.0 4.0 87.0 207.0 254.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 12.0 162.0 120.0 0.0 0.0 0.0 0.0 3.0 148.0 254.0 254.0 174.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 28.0 245.0 208.0 36.0 12.0 24.0 89.0 225.0 254.0 254.0 198.0 17.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 189.0 255.0 247.0 241.0 244.0 254.0 255.0 234.0 80.0 7.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 37.0 128.0 140.0 140.0 140.0 58.0 16.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 47.0 118.0 194.0 253.0 253.0 253.0 253.0 253.0 253.0 215.0 80.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 102.0 198.0 253.0 229.0 155.0 33.0 20.0 20.0 42.0 124.0 251.0 247.0 162.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 63.0 236.0 243.0 105.0 6.0 0.0 0.0 0.0 0.0 0.0 0.0 105.0 253.0 244.0 51.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 242.0 253.0 126.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 199.0 253.0 72.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 253.0 114.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 192.0 253.0 72.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 103.0 64.0 19.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 35.0 244.0 227.0 12.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 127.0 253.0 137.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 120.0 253.0 142.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 69.0 253.0 213.0 27.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 120.0 230.0 183.0 28.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 22.0 160.0 250.0 180.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 194.0 253.0 207.0 79.0 16.0 32.0 0.0 0.0 0.0 0.0 0.0 0.0 18.0 47.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 13.0 154.0 250.0 253.0 253.0 253.0 233.0 235.0 223.0 228.0 228.0 228.0 201.0 129.0 234.0 243.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 69.0 253.0 130.0 83.0 83.0 83.0 83.0 69.0 141.0 143.0 154.0 91.0 214.0 143.0 229.0 253.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 36.0 19.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 15.0 0.0 23.0 36.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 70.0 202.0 255.0 126.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 72.0 239.0 253.0 253.0 253.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 17.0 242.0 253.0 193.0 166.0 253.0 13.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 52.0 202.0 253.0 180.0 7.0 60.0 253.0 119.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 72.0 211.0 248.0 103.0 14.0 0.0 60.0 253.0 153.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 66.0 244.0 250.0 134.0 0.0 9.0 123.0 233.0 253.0 175.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 16.0 232.0 253.0 146.0 52.0 157.0 233.0 253.0 253.0 253.0 52.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 54.0 245.0 253.0 208.0 249.0 253.0 253.0 253.0 253.0 220.0 7.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 220.0 253.0 253.0 240.0 253.0 253.0 252.0 186.0 13.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 43.0 92.0 92.0 47.0 253.0 253.0 139.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 164.0 253.0 141.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 82.0 252.0 253.0 54.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 158.0 253.0 217.0 18.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 40.0 242.0 247.0 77.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 153.0 253.0 226.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 8.0 223.0 253.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 253.0 253.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 118.0 253.0 253.0 58.0 118.0 54.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 43.0 253.0 253.0 253.0 238.0 39.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 171.0 253.0 200.0 68.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 32.0 118.0 207.0 254.0 254.0 254.0 255.0 254.0 138.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 74.0 116.0 234.0 234.0 234.0 234.0 239.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 228.0 37.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 29.0 191.0 244.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 96.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 97.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 222.0 23.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 84.0 248.0 253.0 253.0 253.0 253.0 253.0 253.0 244.0 219.0 219.0 145.0 253.0 253.0 253.0 253.0 212.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 86.0 131.0 221.0 103.0 103.0 103.0 103.0 75.0 0.0 0.0 15.0 253.0 253.0 253.0 253.0 212.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 86.0 200.0 253.0 253.0 253.0 253.0 141.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 203.0 253.0 253.0 253.0 253.0 133.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 25.0 195.0 253.0 253.0 253.0 253.0 253.0 54.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 25.0 194.0 253.0 253.0 253.0 253.0 225.0 139.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 190.0 253.0 253.0 253.0 253.0 230.0 47.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 87.0 244.0 253.0 253.0 253.0 249.0 46.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 8.0 144.0 251.0 253.0 253.0 253.0 249.0 165.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 82.0 253.0 253.0 253.0 253.0 253.0 89.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 89.0 248.0 253.0 253.0 253.0 253.0 151.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 93.0 243.0 253.0 253.0 253.0 253.0 193.0 9.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 192.0 253.0 253.0 253.0 253.0 231.0 65.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 87.0 240.0 253.0 253.0 253.0 212.0 26.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 161.0 253.0 253.0 253.0 78.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 16.0 124.0 253.0 119.0 12.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 123.0 174.0 51.0 14.0 0.0 8.0 78.0 236.0 49.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 253.0 252.0 252.0 211.0 190.0 201.0 252.0 252.0 163.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 253.0 252.0 252.0 252.0 252.0 253.0 252.0 252.0 247.0 38.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 71.0 253.0 252.0 98.0 154.0 215.0 253.0 252.0 252.0 252.0 42.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 106.0 253.0 252.0 21.0 0.0 18.0 42.0 42.0 236.0 252.0 42.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 107.0 255.0 253.0 21.0 0.0 0.0 0.0 0.0 233.0 253.0 60.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 106.0 253.0 252.0 21.0 0.0 0.0 0.0 0.0 232.0 252.0 147.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 106.0 253.0 252.0 21.0 0.0 0.0 0.0 0.0 232.0 252.0 147.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 80.0 227.0 252.0 21.0 0.0 0.0 0.0 0.0 232.0 252.0 147.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 42.0 147.0 12.0 0.0 0.0 0.0 0.0 232.0 252.0 147.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 233.0 253.0 147.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 232.0 252.0 147.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 232.0 252.0 147.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 232.0 252.0 147.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 232.0 252.0 147.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 233.0 253.0 209.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 232.0 252.0 252.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 232.0 252.0 252.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 232.0 252.0 252.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 47.0 217.0 164.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 79.0 168.0 140.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 82.0 198.0 243.0 254.0 254.0 15.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 88.0 253.0 254.0 254.0 254.0 254.0 15.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 50.0 254.0 254.0 254.0 254.0 207.0 134.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 8.0 176.0 254.0 254.0 238.0 105.0 9.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 145.0 255.0 254.0 251.0 30.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 19.0 214.0 254.0 225.0 47.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 199.0 254.0 251.0 103.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 235.0 255.0 151.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 235.0 254.0 134.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 67.0 251.0 226.0 40.0 0.0 0.0 0.0 0.0 17.0 100.0 197.0 171.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 70.0 251.0 181.0 0.0 0.0 0.0 0.0 75.0 249.0 254.0 254.0 254.0 103.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 235.0 181.0 0.0 0.0 0.0 19.0 221.0 254.0 254.0 254.0 254.0 234.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 235.0 181.0 0.0 0.0 0.0 108.0 254.0 254.0 244.0 167.0 216.0 234.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 235.0 204.0 10.0 0.0 2.0 186.0 254.0 242.0 73.0 10.0 205.0 234.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 226.0 255.0 134.0 8.0 6.0 254.0 254.0 119.0 0.0 92.0 254.0 174.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 103.0 254.0 254.0 175.0 72.0 254.0 254.0 147.0 105.0 250.0 254.0 26.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 181.0 253.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 183.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 134.0 254.0 254.0 254.0 254.0 254.0 234.0 184.0 27.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 72.0 238.0 233.0 150.0 133.0 30.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 18.0 18.0 55.0 137.0 192.0 131.0 8.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 16.0 95.0 164.0 254.0 254.0 254.0 254.0 254.0 254.0 178.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 41.0 151.0 207.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 225.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 190.0 254.0 254.0 254.0 254.0 209.0 155.0 65.0 65.0 148.0 254.0 247.0 66.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 69.0 238.0 254.0 166.0 47.0 18.0 0.0 0.0 0.0 114.0 254.0 254.0 89.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 24.0 29.0 2.0 0.0 0.0 0.0 0.0 0.0 114.0 254.0 254.0 89.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 8.0 250.0 254.0 89.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 114.0 254.0 254.0 89.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 188.0 254.0 250.0 74.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 67.0 248.0 254.0 225.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 187.0 254.0 251.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 29.0 229.0 254.0 243.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 27.0 211.0 254.0 254.0 243.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 46.0 228.0 250.0 250.0 250.0 250.0 251.0 254.0 254.0 254.0 65.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 68.0 254.0 254.0 254.0 254.0 254.0 254.0 255.0 254.0 254.0 254.0 145.0 27.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 46.0 226.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 244.0 80.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 154.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 239.0 98.0 170.0 218.0 254.0 254.0 241.0 154.0 14.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 154.0 254.0 254.0 254.0 254.0 254.0 254.0 182.0 41.0 0.0 0.0 24.0 114.0 220.0 254.0 254.0 174.0 12.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 154.0 254.0 254.0 254.0 254.0 252.0 87.0 13.0 0.0 0.0 0.0 0.0 0.0 21.0 57.0 179.0 254.0 82.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 27.0 216.0 254.0 254.0 149.0 22.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 35.0 135.0 82.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 91.0 188.0 64.0 39.0 30.0 0.0 17.0 0.0 17.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 196.0 254.0 254.0 254.0 240.0 185.0 215.0 185.0 215.0 185.0 185.0 31.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 120.0 254.0 213.0 240.0 226.0 180.0 249.0 249.0 249.0 254.0 254.0 137.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 185.0 254.0 59.0 0.0 0.0 0.0 0.0 0.0 0.0 245.0 254.0 151.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 62.0 248.0 183.0 15.0 0.0 0.0 0.0 0.0 0.0 74.0 252.0 254.0 70.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 209.0 249.0 52.0 0.0 0.0 0.0 0.0 0.0 0.0 99.0 254.0 254.0 43.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 91.0 254.0 176.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 120.0 254.0 242.0 35.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 94.0 43.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 207.0 254.0 189.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 207.0 254.0 182.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 207.0 254.0 81.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 207.0 254.0 81.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 207.0 254.0 81.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 15.0 218.0 248.0 62.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 60.0 254.0 227.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 164.0 254.0 227.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 168.0 254.0 227.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 168.0 254.0 227.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 13.0 216.0 254.0 167.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 22.0 254.0 254.0 119.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 181.0 213.0 22.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 75.0 0.0 98.0 185.0 178.0 94.0 19.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 15.0 111.0 195.0 238.0 94.0 0.0 208.0 249.0 254.0 254.0 116.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 20.0 50.0 107.0 197.0 246.0 183.0 25.0 0.0 0.0 81.0 245.0 254.0 249.0 91.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 18.0 84.0 230.0 254.0 254.0 221.0 86.0 0.0 0.0 1.0 125.0 253.0 254.0 178.0 53.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 133.0 254.0 254.0 217.0 118.0 4.0 0.0 0.0 62.0 202.0 254.0 241.0 131.0 8.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 107.0 244.0 254.0 213.0 45.0 0.0 0.0 0.0 62.0 240.0 254.0 220.0 29.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 44.0 246.0 254.0 209.0 49.0 0.0 0.0 0.0 31.0 241.0 254.0 221.0 27.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 95.0 254.0 254.0 55.0 0.0 0.0 0.0 17.0 198.0 254.0 218.0 28.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 27.0 219.0 254.0 233.0 144.0 39.0 42.0 204.0 254.0 205.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 115.0 248.0 254.0 254.0 244.0 233.0 254.0 223.0 24.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 38.0 84.0 168.0 245.0 254.0 254.0 254.0 207.0 115.0 9.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 14.0 236.0 254.0 230.0 163.0 237.0 244.0 211.0 80.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 99.0 254.0 254.0 99.0 0.0 0.0 37.0 225.0 254.0 130.0 8.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 71.0 254.0 229.0 12.0 0.0 0.0 0.0 2.0 170.0 254.0 51.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 96.0 254.0 254.0 18.0 0.0 0.0 0.0 0.0 81.0 254.0 198.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 80.0 254.0 254.0 18.0 0.0 0.0 0.0 0.0 131.0 254.0 119.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 214.0 254.0 78.0 0.0 0.0 0.0 1.0 183.0 244.0 63.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 253.0 223.0 24.0 0.0 2.0 126.0 254.0 178.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 87.0 238.0 222.0 119.0 177.0 254.0 217.0 27.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 18.0 154.0 196.0 196.0 101.0 25.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 67.0 254.0 214.0 25.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 61.0 227.0 35.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 188.0 253.0 253.0 165.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 182.0 253.0 180.0 30.0 0.0 0.0 0.0 0.0 0.0 0.0 49.0 253.0 253.0 253.0 253.0 24.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 37.0 253.0 253.0 253.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 72.0 253.0 253.0 253.0 188.0 8.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 37.0 253.0 253.0 253.0 168.0 0.0 0.0 0.0 0.0 0.0 0.0 169.0 253.0 253.0 233.0 62.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 72.0 253.0 253.0 253.0 168.0 0.0 0.0 0.0 0.0 0.0 11.0 194.0 253.0 253.0 168.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 157.0 253.0 253.0 253.0 168.0 0.0 0.0 41.0 51.0 136.0 167.0 253.0 253.0 253.0 168.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 157.0 253.0 253.0 253.0 201.0 143.0 160.0 235.0 238.0 253.0 253.0 253.0 253.0 253.0 123.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 157.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 254.0 253.0 253.0 253.0 253.0 187.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 157.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 254.0 253.0 253.0 253.0 253.0 180.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 24.0 250.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 249.0 249.0 254.0 255.0 254.0 118.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 85.0 234.0 253.0 253.0 253.0 253.0 231.0 171.0 52.0 145.0 253.0 253.0 253.0 72.0 20.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 19.0 183.0 217.0 176.0 96.0 9.0 0.0 0.0 71.0 253.0 253.0 253.0 226.0 223.0 31.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 25.0 253.0 253.0 253.0 253.0 145.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 112.0 253.0 253.0 253.0 172.0 14.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 10.0 228.0 253.0 253.0 236.0 43.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 53.0 253.0 253.0 253.0 152.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 88.0 253.0 253.0 211.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 13.0 253.0 253.0 205.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 7.0 202.0 253.0 147.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 37.0 125.0 170.0 152.0 255.0 174.0 194.0 101.0 101.0 12.0 68.0 101.0 15.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 93.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 206.0 236.0 253.0 170.0 17.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 93.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 92.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 30.0 211.0 165.0 172.0 253.0 196.0 253.0 253.0 253.0 253.0 253.0 253.0 92.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 34.0 4.0 8.0 61.0 24.0 61.0 154.0 253.0 253.0 253.0 206.0 22.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 124.0 253.0 253.0 253.0 191.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 22.0 246.0 253.0 253.0 214.0 34.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 136.0 253.0 253.0 253.0 137.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 41.0 216.0 253.0 253.0 245.0 67.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 218.0 253.0 253.0 253.0 97.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 104.0 246.0 253.0 253.0 204.0 25.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 107.0 253.0 253.0 253.0 253.0 109.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 185.0 253.0 253.0 247.0 109.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 185.0 253.0 253.0 230.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 185.0 253.0 253.0 230.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 73.0 243.0 253.0 253.0 192.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 90.0 253.0 253.0 251.0 74.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 173.0 253.0 253.0 176.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 67.0 238.0 253.0 49.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 185.0 253.0 22.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 68.0 156.0 253.0 253.0 255.0 253.0 253.0 253.0 165.0 18.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 112.0 237.0 252.0 252.0 252.0 253.0 252.0 252.0 252.0 252.0 106.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 135.0 231.0 231.0 160.0 38.0 21.0 21.0 40.0 252.0 252.0 106.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 48.0 252.0 252.0 106.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 36.0 223.0 252.0 208.0 18.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 25.0 157.0 253.0 243.0 35.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 36.0 183.0 252.0 252.0 237.0 102.0 36.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 20.0 127.0 223.0 253.0 252.0 252.0 252.0 252.0 242.0 153.0 19.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 153.0 252.0 252.0 216.0 153.0 84.0 154.0 215.0 253.0 252.0 202.0 21.0 0.0 0.0 0.0 0.0 43.0 11.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 100.0 252.0 164.0 18.0 0.0 0.0 0.0 18.0 122.0 252.0 252.0 225.0 35.0 0.0 0.0 107.0 141.0 7.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 36.0 224.0 253.0 122.0 105.0 227.0 223.0 35.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 92.0 252.0 252.0 253.0 189.0 32.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 8.0 85.0 252.0 252.0 161.0 14.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 55.0 197.0 252.0 252.0 252.0 106.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 89.0 236.0 252.0 252.0 252.0 252.0 18.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 69.0 236.0 212.0 76.0 245.0 253.0 191.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 101.0 252.0 217.0 41.0 185.0 252.0 252.0 68.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 43.0 234.0 252.0 112.0 192.0 252.0 251.0 134.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 85.0 252.0 252.0 252.0 253.0 252.0 134.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 85.0 252.0 252.0 252.0 191.0 112.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 45.0 174.0 254.0 93.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 199.0 253.0 253.0 253.0 11.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 79.0 253.0 200.0 96.0 206.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 33.0 230.0 253.0 168.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 78.0 253.0 236.0 71.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 169.0 253.0 146.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 30.0 238.0 253.0 60.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 37.0 253.0 253.0 60.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 146.0 253.0 253.0 60.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 157.0 253.0 253.0 60.0 0.0 0.0 0.0 0.0 0.0 0.0 76.0 202.0 155.0 29.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 158.0 254.0 254.0 60.0 0.0 0.0 0.0 0.0 1.0 82.0 209.0 254.0 254.0 220.0 31.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 157.0 253.0 253.0 60.0 0.0 0.0 0.0 0.0 82.0 253.0 253.0 253.0 253.0 253.0 217.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 140.0 253.0 253.0 60.0 0.0 0.0 0.0 18.0 209.0 253.0 231.0 136.0 96.0 216.0 253.0 111.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 37.0 253.0 253.0 60.0 0.0 0.0 0.0 144.0 254.0 214.0 32.0 0.0 0.0 194.0 253.0 156.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 28.0 233.0 253.0 89.0 0.0 0.0 165.0 250.0 246.0 31.0 0.0 0.0 0.0 194.0 253.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 135.0 253.0 236.0 72.0 28.0 237.0 253.0 116.0 0.0 0.0 14.0 102.0 239.0 188.0 9.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 33.0 229.0 253.0 237.0 224.0 253.0 253.0 0.0 0.0 53.0 175.0 253.0 253.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 55.0 231.0 253.0 253.0 253.0 253.0 213.0 166.0 240.0 253.0 253.0 144.0 7.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 111.0 233.0 253.0 253.0 253.0 254.0 253.0 253.0 232.0 116.0 6.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 9.0 116.0 132.0 248.0 254.0 242.0 132.0 49.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 119.0 254.0 215.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 118.0 253.0 213.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 118.0 253.0 213.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 10.0 138.0 253.0 213.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 134.0 253.0 253.0 213.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 253.0 253.0 93.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 167.0 255.0 253.0 103.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 43.0 213.0 254.0 216.0 53.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 43.0 200.0 253.0 254.0 135.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 79.0 253.0 253.0 254.0 135.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 20.0 254.0 254.0 254.0 243.0 105.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 171.0 253.0 253.0 223.0 63.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 79.0 253.0 253.0 254.0 135.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 19.0 240.0 253.0 253.0 200.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 96.0 253.0 253.0 253.0 121.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 215.0 253.0 253.0 253.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 133.0 247.0 253.0 253.0 237.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 156.0 253.0 253.0 253.0 57.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 156.0 253.0 253.0 253.0 57.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 36.0 73.0 192.0 57.0 13.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 115.0 196.0 254.0 254.0 254.0 156.0 17.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 65.0 203.0 253.0 253.0 251.0 248.0 253.0 253.0 159.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 8.0 137.0 249.0 253.0 241.0 147.0 68.0 41.0 117.0 246.0 253.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 109.0 253.0 242.0 157.0 29.0 0.0 0.0 2.0 115.0 250.0 247.0 18.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 22.0 145.0 36.0 0.0 0.0 0.0 0.0 45.0 253.0 253.0 106.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 111.0 153.0 240.0 253.0 219.0 7.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 84.0 253.0 253.0 253.0 230.0 47.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 148.0 239.0 248.0 253.0 253.0 253.0 250.0 99.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 239.0 253.0 253.0 252.0 181.0 253.0 253.0 248.0 95.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 44.0 4.0 4.0 1.0 50.0 184.0 253.0 252.0 78.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 14.0 228.0 253.0 121.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 126.0 253.0 219.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 130.0 253.0 213.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 108.0 93.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 224.0 253.0 120.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 32.0 236.0 167.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 120.0 250.0 253.0 70.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 65.0 253.0 178.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 47.0 253.0 253.0 165.0 6.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 31.0 235.0 178.0 0.0 0.0 0.0 0.0 0.0 17.0 158.0 243.0 253.0 203.0 6.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 219.0 235.0 138.0 90.0 90.0 91.0 149.0 216.0 253.0 248.0 163.0 19.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 162.0 253.0 253.0 253.0 253.0 254.0 253.0 235.0 146.0 24.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 26.0 123.0 165.0 253.0 198.0 153.0 134.0 32.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 14.0 141.0 224.0 79.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 186.0 253.0 253.0 117.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 99.0 254.0 171.0 115.0 36.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 52.0 248.0 244.0 40.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 31.0 219.0 253.0 45.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 119.0 254.0 171.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 103.0 253.0 212.0 9.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 19.0 196.0 228.0 43.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 149.0 253.0 174.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 194.0 253.0 100.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 23.0 255.0 174.0 0.0 0.0 0.0 0.0 50.0 97.0 59.0 14.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 180.0 254.0 135.0 0.0 0.0 53.0 215.0 247.0 253.0 253.0 185.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 195.0 254.0 135.0 0.0 88.0 235.0 254.0 216.0 107.0 172.0 253.0 68.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 195.0 254.0 135.0 88.0 251.0 253.0 154.0 25.0 0.0 136.0 253.0 173.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 195.0 254.0 150.0 235.0 237.0 118.0 0.0 0.0 0.0 136.0 253.0 98.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 99.0 255.0 254.0 254.0 154.0 0.0 0.0 0.0 0.0 137.0 254.0 23.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 15.0 208.0 253.0 253.0 124.0 0.0 13.0 20.0 20.0 183.0 245.0 53.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 127.0 253.0 253.0 241.0 175.0 224.0 253.0 253.0 253.0 126.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 110.0 241.0 253.0 253.0 254.0 253.0 253.0 216.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 41.0 163.0 253.0 254.0 253.0 222.0 94.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 116.0 243.0 224.0 246.0 59.0 0.0 31.0 121.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 149.0 191.0 95.0 8.0 158.0 25.0 17.0 219.0 228.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 14.0 173.0 149.0 56.0 0.0 0.0 61.0 5.0 198.0 228.0 44.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 86.0 200.0 25.0 0.0 0.0 0.0 0.0 66.0 203.0 75.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 125.0 138.0 0.0 0.0 0.0 0.0 43.0 243.0 230.0 46.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 139.0 201.0 6.0 0.0 0.0 0.0 0.0 149.0 252.0 84.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 88.0 228.0 10.0 0.0 0.0 0.0 18.0 152.0 253.0 139.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 225.0 96.0 0.0 0.0 2.0 68.0 194.0 224.0 110.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 49.0 229.0 20.0 28.0 60.0 151.0 255.0 249.0 71.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 41.0 249.0 206.0 253.0 221.0 206.0 246.0 202.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 106.0 196.0 123.0 16.0 135.0 246.0 142.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 110.0 254.0 198.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 29.0 250.0 237.0 25.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 219.0 210.0 24.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 112.0 244.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 244.0 124.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 94.0 233.0 164.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 211.0 222.0 9.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 211.0 125.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 24.0 90.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 110.0 125.0 125.0 125.0 158.0 158.0 125.0 38.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 157.0 254.0 254.0 254.0 254.0 255.0 254.0 254.0 251.0 83.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 172.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 247.0 144.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 8.0 104.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 222.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 10.0 25.0 133.0 184.0 254.0 254.0 254.0 254.0 254.0 222.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 184.0 232.0 254.0 254.0 254.0 254.0 254.0 222.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 117.0 248.0 254.0 254.0 254.0 254.0 254.0 254.0 111.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 216.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 131.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 88.0 242.0 254.0 254.0 254.0 254.0 254.0 254.0 222.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 89.0 241.0 254.0 205.0 236.0 254.0 254.0 230.0 26.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 52.0 65.0 17.0 153.0 254.0 254.0 254.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 53.0 254.0 254.0 254.0 228.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 77.0 254.0 254.0 254.0 137.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 40.0 231.0 254.0 254.0 254.0 98.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 17.0 0.0 0.0 0.0 9.0 152.0 254.0 254.0 254.0 233.0 35.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 142.0 207.0 157.0 50.0 131.0 182.0 254.0 254.0 254.0 254.0 208.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 63.0 244.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 251.0 84.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 106.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 245.0 136.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 49.0 235.0 254.0 254.0 254.0 254.0 254.0 250.0 221.0 36.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 109.0 235.0 254.0 254.0 221.0 32.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 92.0 253.0 253.0 253.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 190.0 251.0 251.0 251.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 190.0 251.0 251.0 251.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 190.0 251.0 251.0 251.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 190.0 251.0 251.0 251.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 191.0 253.0 253.0 253.0 195.0 24.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 190.0 251.0 251.0 251.0 253.0 62.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 190.0 251.0 251.0 251.0 253.0 141.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 51.0 251.0 251.0 251.0 253.0 220.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 32.0 251.0 251.0 251.0 253.0 220.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 12.0 174.0 253.0 253.0 255.0 221.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 32.0 251.0 251.0 251.0 253.0 220.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 32.0 251.0 251.0 251.0 253.0 220.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 32.0 251.0 251.0 251.0 253.0 220.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 32.0 251.0 251.0 251.0 253.0 220.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 20.0 206.0 253.0 253.0 255.0 253.0 126.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 32.0 229.0 251.0 253.0 251.0 126.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 221.0 251.0 253.0 251.0 188.0 95.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 181.0 211.0 253.0 251.0 251.0 188.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 24.0 35.0 153.0 251.0 251.0 89.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 37.0 253.0 255.0 253.0 72.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 63.0 63.0 0.0 0.0 63.0 181.0 252.0 253.0 252.0 71.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 182.0 242.0 215.0 0.0 16.0 222.0 252.0 252.0 237.0 174.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 144.0 253.0 210.0 92.0 1.0 191.0 252.0 252.0 252.0 144.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 94.0 211.0 252.0 206.0 20.0 0.0 144.0 253.0 252.0 252.0 108.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 32.0 227.0 252.0 252.0 20.0 0.0 32.0 237.0 253.0 252.0 220.0 15.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 37.0 211.0 252.0 246.0 132.0 0.0 11.0 150.0 252.0 253.0 252.0 195.0 0.0 0.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 37.0 252.0 252.0 252.0 132.0 0.0 0.0 73.0 252.0 252.0 253.0 252.0 71.0 0.0 145.0 206.0 41.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 182.0 253.0 253.0 253.0 72.0 0.0 0.0 73.0 253.0 253.0 255.0 211.0 109.0 191.0 255.0 253.0 72.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 63.0 242.0 252.0 252.0 252.0 124.0 73.0 42.0 115.0 252.0 252.0 253.0 252.0 252.0 252.0 253.0 231.0 51.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 73.0 252.0 252.0 252.0 252.0 252.0 252.0 222.0 242.0 252.0 252.0 253.0 252.0 252.0 252.0 237.0 153.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 73.0 252.0 252.0 252.0 252.0 252.0 252.0 253.0 252.0 252.0 252.0 253.0 252.0 252.0 252.0 144.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 42.0 160.0 253.0 253.0 253.0 253.0 253.0 255.0 253.0 253.0 253.0 255.0 253.0 237.0 144.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 119.0 210.0 189.0 231.0 252.0 253.0 252.0 252.0 252.0 222.0 138.0 30.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 31.0 10.0 51.0 154.0 253.0 252.0 252.0 252.0 160.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 253.0 252.0 252.0 252.0 253.0 119.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 192.0 253.0 253.0 253.0 255.0 253.0 133.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 78.0 242.0 252.0 252.0 253.0 252.0 174.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 103.0 221.0 252.0 253.0 220.0 61.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 16.0 190.0 108.0 15.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 22.0 245.0 86.0 5.0 11.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 80.0 240.0 177.0 203.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 184.0 252.0 252.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 184.0 252.0 252.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 131.0 252.0 252.0 106.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 32.0 229.0 253.0 244.0 50.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 133.0 252.0 253.0 113.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 68.0 215.0 253.0 219.0 19.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 253.0 252.0 111.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 253.0 252.0 183.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 253.0 184.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 159.0 252.0 196.0 9.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 17.0 227.0 252.0 45.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 161.0 252.0 45.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 57.0 252.0 150.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 47.0 253.0 161.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 47.0 252.0 160.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 47.0 252.0 160.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 47.0 252.0 236.0 19.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 137.0 116.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 27.0 136.0 57.0 18.0 18.0 18.0 18.0 18.0 38.0 136.0 45.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 41.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 41.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 73.0 182.0 157.0 65.0 161.0 212.0 253.0 253.0 253.0 253.0 232.0 30.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 57.0 248.0 253.0 253.0 233.0 60.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 12.0 244.0 253.0 253.0 247.0 52.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 187.0 253.0 253.0 194.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 24.0 113.0 142.0 142.0 249.0 253.0 253.0 93.0 24.0 24.0 24.0 24.0 24.0 24.0 24.0 24.0 24.0 13.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 30.0 240.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 237.0 168.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 52.0 110.0 215.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 215.0 194.0 155.0 46.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 89.0 253.0 253.0 253.0 241.0 230.0 194.0 176.0 69.0 59.0 59.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 89.0 253.0 253.0 253.0 167.0 29.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 89.0 253.0 253.0 253.0 94.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 89.0 253.0 253.0 230.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 89.0 253.0 253.0 243.0 55.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 89.0 253.0 253.0 253.0 94.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 89.0 253.0 253.0 253.0 94.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 89.0 253.0 253.0 234.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 89.0 253.0 253.0 230.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 122.0 135.0 68.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 157.0 241.0 247.0 130.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 87.0 241.0 241.0 198.0 222.0 253.0 152.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 19.0 168.0 253.0 243.0 41.0 0.0 16.0 178.0 254.0 109.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 146.0 253.0 207.0 39.0 0.0 0.0 0.0 52.0 235.0 120.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 72.0 243.0 240.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 209.0 243.0 71.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 20.0 209.0 253.0 145.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 136.0 254.0 225.0 18.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 238.0 254.0 89.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 109.0 253.0 202.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 135.0 254.0 182.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 116.0 253.0 129.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 154.0 253.0 91.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 27.0 238.0 253.0 129.0 0.0 0.0 0.0 0.0 12.0 19.0 19.0 19.0 12.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 27.0 238.0 253.0 181.0 0.0 0.0 40.0 124.0 228.0 253.0 253.0 253.0 227.0 66.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 141.0 254.0 202.0 5.0 153.0 254.0 254.0 255.0 186.0 191.0 254.0 254.0 202.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 90.0 253.0 254.0 237.0 250.0 223.0 108.0 18.0 2.0 3.0 203.0 253.0 254.0 18.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 145.0 254.0 253.0 253.0 125.0 0.0 0.0 8.0 50.0 226.0 253.0 146.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 20.0 208.0 253.0 253.0 249.0 199.0 200.0 211.0 253.0 251.0 169.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 124.0 175.0 253.0 253.0 254.0 253.0 207.0 86.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 38.0 122.0 246.0 255.0 255.0 245.0 121.0 8.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 57.0 176.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 155.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 191.0 253.0 253.0 253.0 253.0 250.0 248.0 253.0 253.0 253.0 105.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 126.0 253.0 253.0 245.0 210.0 111.0 37.0 0.0 155.0 253.0 253.0 187.0 14.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 253.0 253.0 250.0 139.0 0.0 0.0 0.0 0.0 15.0 226.0 253.0 253.0 116.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 253.0 253.0 141.0 0.0 0.0 0.0 0.0 0.0 0.0 76.0 253.0 253.0 219.0 25.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 73.0 253.0 238.0 22.0 0.0 0.0 0.0 0.0 0.0 14.0 221.0 253.0 253.0 253.0 150.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 114.0 253.0 235.0 21.0 0.0 0.0 0.0 0.0 32.0 193.0 253.0 253.0 253.0 253.0 230.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 61.0 253.0 253.0 126.0 0.0 0.0 2.0 40.0 171.0 253.0 253.0 253.0 253.0 253.0 159.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 253.0 253.0 211.0 96.0 55.0 159.0 253.0 253.0 253.0 253.0 253.0 253.0 240.0 73.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 133.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 214.0 253.0 253.0 188.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 97.0 174.0 245.0 253.0 252.0 232.0 192.0 22.0 65.0 253.0 253.0 87.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 54.0 86.0 81.0 0.0 0.0 0.0 21.0 222.0 235.0 28.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 23.0 224.0 226.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 72.0 253.0 123.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 168.0 253.0 192.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 168.0 253.0 237.0 33.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 168.0 253.0 253.0 81.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 168.0 253.0 253.0 81.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 97.0 233.0 242.0 46.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 18.0 18.0 18.0 126.0 136.0 175.0 26.0 166.0 255.0 247.0 127.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 30.0 36.0 94.0 154.0 170.0 253.0 253.0 253.0 253.0 253.0 225.0 172.0 253.0 242.0 195.0 64.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 49.0 238.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 251.0 93.0 82.0 82.0 56.0 39.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 18.0 219.0 253.0 253.0 253.0 253.0 253.0 198.0 182.0 247.0 241.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 80.0 156.0 107.0 253.0 253.0 205.0 11.0 0.0 43.0 154.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 14.0 1.0 154.0 253.0 90.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 139.0 253.0 190.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 190.0 253.0 70.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 35.0 241.0 225.0 160.0 108.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 81.0 240.0 253.0 253.0 119.0 25.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 45.0 186.0 253.0 253.0 150.0 27.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 16.0 93.0 252.0 253.0 187.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 249.0 253.0 249.0 64.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 46.0 130.0 183.0 253.0 253.0 207.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 39.0 148.0 229.0 253.0 253.0 253.0 250.0 182.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 24.0 114.0 221.0 253.0 253.0 253.0 253.0 201.0 78.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 23.0 66.0 213.0 253.0 253.0 253.0 253.0 198.0 81.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 18.0 171.0 219.0 253.0 253.0 253.0 253.0 195.0 80.0 9.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 55.0 172.0 226.0 253.0 253.0 253.0 253.0 244.0 133.0 11.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 136.0 253.0 253.0 253.0 212.0 135.0 132.0 16.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 51.0 159.0 253.0 159.0 50.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 48.0 238.0 252.0 252.0 252.0 237.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 54.0 227.0 253.0 252.0 239.0 233.0 252.0 57.0 6.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 10.0 60.0 224.0 252.0 253.0 252.0 202.0 84.0 252.0 253.0 122.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 163.0 252.0 252.0 252.0 253.0 252.0 252.0 96.0 189.0 253.0 167.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 51.0 238.0 253.0 253.0 190.0 114.0 253.0 228.0 47.0 79.0 255.0 168.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 48.0 238.0 252.0 252.0 179.0 12.0 75.0 121.0 21.0 0.0 0.0 253.0 243.0 50.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 38.0 165.0 253.0 233.0 208.0 84.0 0.0 0.0 0.0 0.0 0.0 0.0 253.0 252.0 165.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 7.0 178.0 252.0 240.0 71.0 19.0 28.0 0.0 0.0 0.0 0.0 0.0 0.0 253.0 252.0 195.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 57.0 252.0 252.0 63.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 253.0 252.0 195.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 198.0 253.0 190.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 253.0 196.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 76.0 246.0 252.0 112.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 253.0 252.0 148.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 85.0 252.0 230.0 25.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 7.0 135.0 253.0 186.0 12.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 85.0 252.0 223.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 7.0 131.0 252.0 225.0 71.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 85.0 252.0 145.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 48.0 165.0 252.0 173.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 86.0 253.0 225.0 0.0 0.0 0.0 0.0 0.0 0.0 114.0 238.0 253.0 162.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 85.0 252.0 249.0 146.0 48.0 29.0 85.0 178.0 225.0 253.0 223.0 167.0 56.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 85.0 252.0 252.0 252.0 229.0 215.0 252.0 252.0 252.0 196.0 130.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 28.0 199.0 252.0 252.0 253.0 252.0 252.0 233.0 145.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 25.0 128.0 252.0 253.0 252.0 141.0 37.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 67.0 232.0 39.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 62.0 81.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 120.0 180.0 39.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 126.0 163.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 153.0 210.0 40.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 220.0 163.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 27.0 254.0 162.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 222.0 163.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 183.0 254.0 125.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 46.0 245.0 163.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 198.0 254.0 56.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 120.0 254.0 163.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 23.0 231.0 254.0 29.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 159.0 254.0 120.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 163.0 254.0 216.0 16.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 159.0 254.0 67.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 14.0 86.0 178.0 248.0 254.0 91.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 159.0 254.0 85.0 0.0 0.0 0.0 47.0 49.0 116.0 144.0 150.0 241.0 243.0 234.0 179.0 241.0 252.0 40.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 150.0 253.0 237.0 207.0 207.0 207.0 253.0 254.0 250.0 240.0 198.0 143.0 91.0 28.0 5.0 233.0 250.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 119.0 177.0 177.0 177.0 177.0 177.0 98.0 56.0 0.0 0.0 0.0 0.0 0.0 102.0 254.0 220.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 169.0 254.0 137.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 169.0 254.0 57.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 169.0 254.0 57.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 169.0 255.0 94.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 169.0 254.0 96.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 169.0 254.0 153.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 169.0 255.0 153.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 96.0 254.0 153.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 124.0 253.0 255.0 63.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 96.0 244.0 251.0 253.0 62.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 127.0 251.0 251.0 253.0 62.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 68.0 236.0 251.0 211.0 31.0 8.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 60.0 228.0 251.0 251.0 94.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 155.0 253.0 253.0 189.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 20.0 253.0 251.0 235.0 66.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 32.0 205.0 253.0 251.0 126.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 104.0 251.0 253.0 184.0 15.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 80.0 240.0 251.0 193.0 23.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 32.0 253.0 253.0 253.0 159.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 151.0 251.0 251.0 251.0 39.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 48.0 221.0 251.0 251.0 172.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 234.0 251.0 251.0 196.0 12.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 253.0 251.0 251.0 89.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 159.0 255.0 253.0 253.0 31.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 48.0 228.0 253.0 247.0 140.0 8.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 251.0 253.0 220.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 251.0 253.0 220.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 24.0 193.0 253.0 220.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 55.0 148.0 210.0 253.0 253.0 113.0 87.0 148.0 55.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 87.0 232.0 252.0 253.0 189.0 210.0 252.0 252.0 253.0 168.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 57.0 242.0 252.0 190.0 65.0 5.0 12.0 182.0 252.0 253.0 116.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 96.0 252.0 252.0 183.0 14.0 0.0 0.0 92.0 252.0 252.0 225.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 132.0 253.0 252.0 146.0 14.0 0.0 0.0 0.0 215.0 252.0 252.0 79.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 126.0 253.0 247.0 176.0 9.0 0.0 0.0 8.0 78.0 245.0 253.0 129.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 16.0 232.0 252.0 176.0 0.0 0.0 0.0 36.0 201.0 252.0 252.0 169.0 11.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 22.0 252.0 252.0 30.0 22.0 119.0 197.0 241.0 253.0 252.0 251.0 77.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 16.0 231.0 252.0 253.0 252.0 252.0 252.0 226.0 227.0 252.0 231.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 55.0 235.0 253.0 217.0 138.0 42.0 24.0 192.0 252.0 143.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 62.0 255.0 253.0 109.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 71.0 253.0 252.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 253.0 252.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 71.0 253.0 252.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 106.0 253.0 252.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 45.0 255.0 253.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 218.0 252.0 56.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 96.0 252.0 189.0 42.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 14.0 184.0 252.0 170.0 11.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 14.0 147.0 252.0 42.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 13.0 25.0 100.0 122.0 7.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 33.0 151.0 208.0 252.0 252.0 252.0 146.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 40.0 152.0 244.0 252.0 253.0 224.0 211.0 252.0 232.0 40.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 15.0 152.0 239.0 252.0 252.0 252.0 216.0 31.0 37.0 252.0 252.0 60.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 96.0 252.0 252.0 252.0 252.0 217.0 29.0 0.0 37.0 252.0 252.0 60.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 181.0 252.0 252.0 220.0 167.0 30.0 0.0 0.0 77.0 252.0 252.0 60.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 26.0 128.0 58.0 22.0 0.0 0.0 0.0 0.0 100.0 252.0 252.0 60.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 157.0 252.0 252.0 60.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 110.0 121.0 122.0 121.0 202.0 252.0 194.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 10.0 53.0 179.0 253.0 253.0 255.0 253.0 253.0 228.0 35.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 54.0 227.0 252.0 243.0 228.0 170.0 242.0 252.0 252.0 231.0 117.0 6.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 78.0 252.0 252.0 125.0 59.0 0.0 18.0 208.0 252.0 252.0 252.0 252.0 87.0 7.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 135.0 252.0 252.0 180.0 16.0 0.0 21.0 203.0 253.0 247.0 129.0 173.0 252.0 252.0 184.0 66.0 49.0 49.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 136.0 252.0 241.0 106.0 17.0 0.0 53.0 200.0 252.0 216.0 65.0 0.0 14.0 72.0 163.0 241.0 252.0 252.0 223.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 105.0 252.0 242.0 88.0 18.0 73.0 170.0 244.0 252.0 126.0 29.0 0.0 0.0 0.0 0.0 0.0 89.0 180.0 180.0 37.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 231.0 252.0 245.0 205.0 216.0 252.0 252.0 252.0 124.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 207.0 252.0 252.0 252.0 252.0 178.0 116.0 36.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 13.0 93.0 143.0 121.0 23.0 6.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 145.0 255.0 211.0 31.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 32.0 237.0 253.0 252.0 71.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 175.0 253.0 252.0 71.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 144.0 253.0 252.0 71.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 16.0 191.0 253.0 252.0 71.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 26.0 221.0 253.0 252.0 124.0 31.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 125.0 253.0 252.0 252.0 108.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 253.0 252.0 252.0 108.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 253.0 253.0 108.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 253.0 252.0 252.0 108.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 253.0 252.0 252.0 108.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 253.0 252.0 252.0 108.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 253.0 253.0 170.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 253.0 252.0 252.0 252.0 42.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 149.0 252.0 252.0 252.0 144.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 109.0 252.0 252.0 252.0 144.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 218.0 253.0 253.0 255.0 35.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 175.0 252.0 252.0 253.0 35.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 73.0 252.0 252.0 253.0 35.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 31.0 211.0 252.0 253.0 35.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 38.0 43.0 105.0 255.0 253.0 253.0 253.0 253.0 253.0 174.0 6.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 43.0 139.0 224.0 226.0 252.0 253.0 252.0 252.0 252.0 252.0 252.0 252.0 158.0 14.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 178.0 252.0 252.0 252.0 252.0 253.0 252.0 252.0 252.0 252.0 252.0 252.0 252.0 59.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 109.0 252.0 252.0 230.0 132.0 133.0 132.0 132.0 189.0 252.0 252.0 252.0 252.0 59.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 29.0 29.0 24.0 0.0 0.0 0.0 0.0 14.0 226.0 252.0 252.0 172.0 7.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 85.0 243.0 252.0 252.0 144.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 88.0 189.0 252.0 252.0 252.0 14.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 91.0 212.0 247.0 252.0 252.0 252.0 204.0 9.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 32.0 125.0 193.0 193.0 193.0 253.0 252.0 252.0 252.0 238.0 102.0 28.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 45.0 222.0 252.0 252.0 252.0 252.0 253.0 252.0 252.0 252.0 177.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 45.0 223.0 253.0 253.0 253.0 253.0 255.0 253.0 253.0 253.0 253.0 74.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 31.0 123.0 52.0 44.0 44.0 44.0 44.0 143.0 252.0 252.0 74.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 15.0 252.0 252.0 74.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 86.0 252.0 252.0 74.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 75.0 9.0 0.0 0.0 0.0 0.0 0.0 0.0 98.0 242.0 252.0 252.0 74.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 61.0 183.0 252.0 29.0 0.0 0.0 0.0 0.0 18.0 92.0 239.0 252.0 252.0 243.0 65.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 208.0 252.0 252.0 147.0 134.0 134.0 134.0 134.0 203.0 253.0 252.0 252.0 188.0 83.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 208.0 252.0 252.0 252.0 252.0 252.0 252.0 252.0 252.0 253.0 230.0 153.0 8.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 49.0 157.0 252.0 252.0 252.0 252.0 252.0 217.0 207.0 146.0 45.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 7.0 103.0 235.0 252.0 172.0 103.0 24.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 63.0 197.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 20.0 254.0 230.0 24.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 20.0 254.0 254.0 48.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 20.0 254.0 255.0 48.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 20.0 254.0 254.0 57.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 20.0 254.0 254.0 108.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 16.0 239.0 254.0 143.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 178.0 254.0 143.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 178.0 254.0 143.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 178.0 254.0 162.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 178.0 254.0 240.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 113.0 254.0 240.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 83.0 254.0 245.0 31.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 79.0 254.0 246.0 38.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 214.0 254.0 150.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 144.0 241.0 8.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 144.0 240.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 144.0 254.0 82.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 230.0 247.0 40.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 168.0 209.0 31.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 189.0 190.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 143.0 247.0 153.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 136.0 247.0 242.0 86.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 192.0 252.0 187.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 62.0 185.0 18.0 0.0 0.0 0.0 0.0 89.0 236.0 217.0 47.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 216.0 253.0 60.0 0.0 0.0 0.0 0.0 212.0 255.0 81.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 206.0 252.0 68.0 0.0 0.0 0.0 48.0 242.0 253.0 89.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 131.0 251.0 212.0 21.0 0.0 0.0 11.0 167.0 252.0 197.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 29.0 232.0 247.0 63.0 0.0 0.0 0.0 153.0 252.0 226.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 45.0 219.0 252.0 143.0 0.0 0.0 0.0 116.0 249.0 252.0 103.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 96.0 253.0 255.0 253.0 200.0 122.0 7.0 25.0 201.0 250.0 158.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 92.0 252.0 252.0 253.0 217.0 252.0 252.0 200.0 227.0 252.0 231.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 87.0 251.0 247.0 231.0 65.0 48.0 189.0 252.0 252.0 253.0 252.0 251.0 227.0 35.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 190.0 221.0 98.0 0.0 0.0 0.0 42.0 196.0 252.0 253.0 252.0 252.0 162.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 111.0 29.0 0.0 0.0 0.0 0.0 62.0 239.0 252.0 86.0 42.0 42.0 14.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 15.0 148.0 253.0 218.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 121.0 252.0 231.0 28.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 31.0 221.0 251.0 129.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 218.0 252.0 160.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 122.0 252.0 82.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 42.0 118.0 219.0 166.0 118.0 118.0 6.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 103.0 242.0 254.0 254.0 254.0 254.0 254.0 66.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 18.0 232.0 254.0 254.0 254.0 254.0 254.0 238.0 70.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 104.0 244.0 254.0 224.0 254.0 254.0 254.0 141.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 207.0 254.0 210.0 254.0 254.0 254.0 34.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 84.0 206.0 254.0 254.0 254.0 254.0 41.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 24.0 209.0 254.0 254.0 254.0 171.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 91.0 137.0 253.0 254.0 254.0 254.0 112.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 40.0 214.0 250.0 254.0 254.0 254.0 254.0 254.0 34.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 81.0 247.0 254.0 254.0 254.0 254.0 254.0 254.0 146.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 110.0 246.0 254.0 254.0 254.0 254.0 254.0 171.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 73.0 89.0 89.0 93.0 240.0 254.0 171.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 128.0 254.0 219.0 31.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 7.0 254.0 254.0 214.0 28.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 138.0 254.0 254.0 116.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 19.0 177.0 90.0 0.0 0.0 0.0 0.0 0.0 25.0 240.0 254.0 254.0 34.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 164.0 254.0 215.0 63.0 36.0 0.0 51.0 89.0 206.0 254.0 254.0 139.0 8.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 57.0 197.0 254.0 254.0 222.0 180.0 241.0 254.0 254.0 253.0 213.0 11.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 140.0 105.0 254.0 254.0 254.0 254.0 254.0 254.0 236.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 7.0 117.0 117.0 165.0 254.0 254.0 239.0 50.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 31.0 40.0 129.0 234.0 234.0 159.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 68.0 150.0 239.0 254.0 253.0 253.0 253.0 215.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 156.0 201.0 254.0 254.0 254.0 241.0 150.0 98.0 8.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 19.0 154.0 254.0 236.0 203.0 83.0 39.0 30.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 144.0 253.0 145.0 12.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 10.0 129.0 222.0 78.0 79.0 8.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 134.0 253.0 167.0 8.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 254.0 78.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 201.0 253.0 226.0 69.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 55.0 6.0 0.0 18.0 128.0 253.0 241.0 41.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 25.0 205.0 235.0 92.0 0.0 0.0 20.0 253.0 253.0 58.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 231.0 245.0 108.0 0.0 0.0 0.0 132.0 253.0 185.0 14.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 121.0 245.0 254.0 254.0 254.0 217.0 254.0 223.0 50.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 116.0 165.0 233.0 233.0 234.0 180.0 39.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 12.0 99.0 91.0 142.0 155.0 246.0 182.0 155.0 155.0 155.0 155.0 131.0 52.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 138.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 252.0 210.0 122.0 33.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 220.0 254.0 254.0 254.0 235.0 189.0 189.0 189.0 189.0 150.0 189.0 205.0 254.0 254.0 254.0 75.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 35.0 74.0 35.0 35.0 25.0 0.0 0.0 0.0 0.0 0.0 0.0 13.0 224.0 254.0 254.0 153.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 90.0 254.0 254.0 247.0 53.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 152.0 246.0 254.0 254.0 49.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 66.0 158.0 254.0 254.0 249.0 103.0 8.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 54.0 251.0 254.0 254.0 254.0 248.0 74.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 140.0 254.0 254.0 254.0 254.0 254.0 254.0 202.0 125.0 45.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 58.0 181.0 234.0 254.0 254.0 254.0 254.0 254.0 254.0 252.0 140.0 22.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 30.0 50.0 73.0 155.0 253.0 254.0 254.0 254.0 254.0 191.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 91.0 200.0 254.0 254.0 254.0 254.0 118.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 192.0 254.0 254.0 254.0 154.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 141.0 254.0 254.0 254.0 116.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 25.0 126.0 86.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 188.0 254.0 254.0 250.0 61.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 24.0 209.0 254.0 15.0 0.0 0.0 0.0 0.0 0.0 23.0 137.0 254.0 254.0 254.0 209.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 168.0 254.0 254.0 48.0 9.0 0.0 0.0 9.0 127.0 241.0 254.0 254.0 255.0 242.0 63.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 101.0 254.0 254.0 254.0 205.0 190.0 190.0 205.0 254.0 254.0 254.0 254.0 242.0 67.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 33.0 166.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 250.0 138.0 55.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 7.0 88.0 154.0 116.0 194.0 194.0 154.0 154.0 88.0 49.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 38.0 222.0 225.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 147.0 234.0 252.0 176.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 23.0 197.0 253.0 252.0 208.0 19.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 38.0 178.0 252.0 253.0 117.0 65.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 57.0 252.0 252.0 253.0 89.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 38.0 222.0 253.0 253.0 79.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 131.0 252.0 179.0 27.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 198.0 246.0 220.0 37.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 79.0 253.0 252.0 135.0 28.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 16.0 140.0 253.0 252.0 118.0 0.0 0.0 0.0 0.0 111.0 140.0 140.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 13.0 191.0 255.0 253.0 56.0 0.0 0.0 114.0 113.0 222.0 253.0 253.0 255.0 27.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 76.0 252.0 253.0 223.0 37.0 0.0 48.0 174.0 252.0 252.0 242.0 214.0 253.0 199.0 31.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 13.0 109.0 252.0 228.0 130.0 0.0 38.0 165.0 253.0 233.0 164.0 49.0 63.0 253.0 214.0 31.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 73.0 252.0 252.0 126.0 0.0 23.0 178.0 252.0 240.0 148.0 7.0 44.0 215.0 240.0 148.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 119.0 252.0 252.0 0.0 0.0 197.0 252.0 252.0 63.0 0.0 57.0 252.0 252.0 140.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 135.0 253.0 174.0 0.0 48.0 229.0 253.0 112.0 0.0 38.0 222.0 253.0 112.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 135.0 252.0 173.0 0.0 48.0 227.0 252.0 158.0 226.0 234.0 201.0 27.0 12.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 57.0 252.0 252.0 57.0 104.0 240.0 252.0 252.0 253.0 233.0 74.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 51.0 242.0 252.0 253.0 252.0 252.0 252.0 252.0 240.0 148.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 75.0 189.0 253.0 252.0 252.0 157.0 112.0 63.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 168.0 242.0 28.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 10.0 228.0 254.0 100.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 190.0 254.0 122.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 83.0 254.0 162.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 29.0 254.0 248.0 25.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 29.0 255.0 254.0 103.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 29.0 254.0 254.0 109.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 29.0 254.0 254.0 109.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 29.0 254.0 254.0 109.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 29.0 255.0 254.0 109.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 29.0 254.0 254.0 109.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 29.0 254.0 254.0 63.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 29.0 254.0 254.0 28.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 29.0 254.0 254.0 28.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 29.0 254.0 254.0 35.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 29.0 254.0 254.0 109.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 212.0 254.0 109.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 203.0 254.0 178.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 155.0 254.0 190.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 32.0 199.0 104.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 115.0 121.0 162.0 253.0 253.0 213.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 63.0 107.0 170.0 251.0 252.0 252.0 252.0 252.0 250.0 214.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 25.0 192.0 226.0 226.0 241.0 252.0 253.0 202.0 252.0 252.0 252.0 252.0 252.0 225.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 68.0 223.0 252.0 252.0 252.0 252.0 252.0 39.0 19.0 39.0 65.0 224.0 252.0 252.0 183.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 186.0 252.0 252.0 252.0 245.0 108.0 53.0 0.0 0.0 0.0 150.0 252.0 252.0 220.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 70.0 242.0 252.0 252.0 222.0 59.0 0.0 0.0 0.0 0.0 0.0 178.0 252.0 252.0 141.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 185.0 252.0 252.0 194.0 67.0 0.0 0.0 0.0 0.0 17.0 90.0 240.0 252.0 194.0 67.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 83.0 205.0 190.0 24.0 0.0 0.0 0.0 0.0 0.0 121.0 252.0 252.0 209.0 24.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 77.0 247.0 252.0 248.0 106.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 253.0 252.0 252.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 134.0 255.0 253.0 253.0 39.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 183.0 253.0 252.0 107.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 10.0 102.0 252.0 253.0 163.0 16.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 13.0 168.0 252.0 252.0 110.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 41.0 252.0 252.0 217.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 40.0 155.0 252.0 214.0 31.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 165.0 252.0 252.0 106.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 43.0 179.0 252.0 150.0 39.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 137.0 252.0 221.0 39.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 67.0 252.0 79.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 93.0 164.0 211.0 250.0 250.0 194.0 15.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 20.0 176.0 253.0 237.0 180.0 180.0 243.0 254.0 214.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 204.0 236.0 135.0 18.0 0.0 0.0 40.0 242.0 252.0 126.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 69.0 253.0 167.0 0.0 0.0 0.0 0.0 0.0 130.0 254.0 223.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 74.0 217.0 79.0 0.0 0.0 0.0 0.0 0.0 46.0 254.0 231.0 14.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 8.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 39.0 254.0 254.0 104.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 212.0 254.0 141.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 207.0 254.0 141.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 7.0 215.0 254.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 39.0 254.0 254.0 56.0 0.0 0.0 20.0 67.0 124.0 39.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 7.0 35.0 98.0 254.0 254.0 208.0 157.0 207.0 225.0 254.0 241.0 160.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 9.0 31.0 82.0 137.0 203.0 203.0 212.0 254.0 254.0 254.0 254.0 251.0 223.0 223.0 127.0 52.0 33.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 9.0 137.0 214.0 254.0 254.0 254.0 254.0 240.0 228.0 250.0 254.0 254.0 154.0 50.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 185.0 254.0 247.0 179.0 146.0 67.0 60.0 28.0 0.0 216.0 254.0 220.0 12.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 222.0 49.0 0.0 0.0 0.0 0.0 4.0 137.0 244.0 232.0 50.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 206.0 4.0 0.0 0.0 0.0 8.0 179.0 254.0 247.0 64.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 216.0 254.0 158.0 177.0 130.0 96.0 213.0 252.0 199.0 49.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 131.0 247.0 249.0 249.0 249.0 171.0 72.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 203.0 229.0 32.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 26.0 47.0 47.0 30.0 95.0 254.0 215.0 13.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 45.0 154.0 185.0 185.0 223.0 253.0 253.0 133.0 175.0 255.0 188.0 19.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 110.0 253.0 253.0 253.0 246.0 161.0 228.0 253.0 253.0 254.0 92.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 245.0 253.0 158.0 137.0 21.0 0.0 48.0 233.0 253.0 233.0 8.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 139.0 254.0 223.0 25.0 0.0 0.0 36.0 170.0 254.0 244.0 106.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 55.0 212.0 253.0 161.0 11.0 26.0 178.0 253.0 236.0 113.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 7.0 155.0 253.0 228.0 80.0 223.0 253.0 253.0 109.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 141.0 253.0 253.0 253.0 254.0 253.0 154.0 29.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 110.0 253.0 253.0 253.0 254.0 179.0 38.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 171.0 254.0 254.0 254.0 179.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 171.0 253.0 253.0 253.0 253.0 178.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 26.0 123.0 254.0 253.0 203.0 156.0 253.0 200.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 93.0 253.0 254.0 121.0 13.0 93.0 253.0 158.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 239.0 253.0 76.0 8.0 32.0 219.0 253.0 126.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 133.0 254.0 191.0 0.0 5.0 108.0 234.0 254.0 106.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 132.0 253.0 190.0 5.0 85.0 253.0 236.0 154.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 153.0 253.0 169.0 192.0 253.0 253.0 77.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 112.0 253.0 253.0 254.0 236.0 129.0 9.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 17.0 118.0 243.0 191.0 113.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 34.0 169.0 250.0 40.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 58.0 242.0 221.0 143.0 17.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 75.0 247.0 143.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 37.0 245.0 184.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 8.0 192.0 200.0 14.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 139.0 247.0 28.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 7.0 231.0 183.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 125.0 243.0 50.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 195.0 184.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 61.0 251.0 41.0 0.0 0.0 0.0 64.0 43.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 152.0 210.0 7.0 0.0 96.0 237.0 254.0 247.0 107.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 250.0 84.0 0.0 6.0 223.0 84.0 13.0 87.0 246.0 72.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 43.0 254.0 80.0 0.0 56.0 151.0 0.0 0.0 0.0 147.0 193.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 67.0 254.0 41.0 0.0 13.0 19.0 0.0 0.0 0.0 42.0 253.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 67.0 254.0 13.0 0.0 0.0 0.0 0.0 0.0 0.0 14.0 253.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 68.0 255.0 13.0 0.0 0.0 0.0 0.0 0.0 0.0 77.0 240.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 67.0 254.0 13.0 0.0 0.0 0.0 0.0 0.0 5.0 181.0 147.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 25.0 229.0 105.0 0.0 0.0 0.0 0.0 5.0 156.0 213.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 107.0 246.0 105.0 14.0 49.0 95.0 217.0 209.0 27.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 107.0 246.0 253.0 253.0 240.0 130.0 6.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 18.0 105.0 227.0 253.0 253.0 122.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 57.0 199.0 253.0 252.0 252.0 252.0 252.0 159.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 20.0 211.0 252.0 232.0 152.0 73.0 167.0 252.0 215.0 6.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 197.0 252.0 182.0 0.0 0.0 0.0 37.0 235.0 243.0 47.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 188.0 252.0 103.0 0.0 0.0 0.0 37.0 235.0 229.0 27.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 189.0 253.0 86.0 8.0 43.0 139.0 190.0 211.0 45.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 232.0 252.0 200.0 201.0 252.0 252.0 84.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 213.0 245.0 252.0 253.0 252.0 242.0 42.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 56.0 84.0 253.0 252.0 160.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 45.0 253.0 252.0 38.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 89.0 255.0 253.0 38.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 80.0 253.0 189.0 32.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 41.0 179.0 232.0 84.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 15.0 225.0 252.0 115.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 153.0 252.0 164.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 68.0 245.0 243.0 79.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 32.0 237.0 245.0 82.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 9.0 148.0 252.0 169.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 106.0 253.0 196.0 7.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 54.0 228.0 129.0 28.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 38.0 190.0 25.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 13.0 25.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 112.0 252.0 125.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 132.0 252.0 113.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 61.0 252.0 252.0 36.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 132.0 252.0 240.0 79.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 84.0 252.0 252.0 36.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 132.0 252.0 252.0 238.0 52.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 12.0 198.0 252.0 252.0 122.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 99.0 252.0 252.0 252.0 181.0 17.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 49.0 252.0 252.0 252.0 122.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 125.0 252.0 252.0 252.0 100.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 26.0 218.0 252.0 252.0 36.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 15.0 216.0 252.0 252.0 207.0 19.0 0.0 0.0 0.0 0.0 0.0 0.0 49.0 252.0 252.0 252.0 36.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 157.0 252.0 252.0 252.0 48.0 0.0 0.0 0.0 6.0 109.0 109.0 194.0 252.0 252.0 252.0 36.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 100.0 252.0 252.0 252.0 105.0 0.0 58.0 116.0 128.0 252.0 252.0 252.0 252.0 252.0 212.0 19.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 164.0 253.0 253.0 253.0 253.0 253.0 253.0 255.0 253.0 253.0 253.0 253.0 253.0 253.0 99.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 49.0 252.0 252.0 252.0 252.0 252.0 252.0 253.0 252.0 252.0 252.0 252.0 252.0 252.0 155.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 49.0 252.0 252.0 252.0 252.0 252.0 252.0 217.0 216.0 141.0 126.0 252.0 252.0 252.0 155.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 49.0 252.0 252.0 252.0 234.0 204.0 89.0 0.0 0.0 0.0 49.0 252.0 252.0 252.0 155.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 14.0 158.0 192.0 151.0 45.0 0.0 0.0 0.0 0.0 0.0 49.0 252.0 252.0 252.0 225.0 17.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 49.0 252.0 252.0 252.0 252.0 23.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 33.0 228.0 252.0 252.0 252.0 157.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 55.0 229.0 252.0 252.0 252.0 11.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 53.0 232.0 252.0 252.0 63.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 90.0 206.0 131.0 11.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 253.0 255.0 63.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 96.0 205.0 251.0 253.0 205.0 111.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 96.0 189.0 251.0 251.0 253.0 251.0 251.0 31.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 16.0 64.0 223.0 244.0 251.0 251.0 211.0 213.0 251.0 251.0 31.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 80.0 181.0 251.0 253.0 251.0 251.0 251.0 94.0 96.0 251.0 251.0 31.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 92.0 253.0 253.0 253.0 255.0 253.0 253.0 253.0 95.0 96.0 253.0 253.0 31.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 92.0 236.0 251.0 243.0 220.0 233.0 251.0 251.0 243.0 82.0 96.0 251.0 251.0 31.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 80.0 253.0 251.0 251.0 188.0 0.0 96.0 251.0 251.0 109.0 0.0 96.0 251.0 251.0 31.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 96.0 240.0 253.0 243.0 188.0 42.0 0.0 96.0 204.0 109.0 4.0 0.0 12.0 197.0 251.0 31.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 221.0 251.0 253.0 121.0 0.0 0.0 0.0 36.0 23.0 0.0 0.0 0.0 0.0 190.0 251.0 31.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 48.0 234.0 253.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 191.0 253.0 31.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 44.0 221.0 251.0 251.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 12.0 197.0 251.0 31.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 190.0 251.0 251.0 251.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 96.0 251.0 251.0 31.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 190.0 251.0 251.0 113.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 40.0 234.0 251.0 219.0 23.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 190.0 251.0 251.0 94.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 40.0 217.0 253.0 231.0 47.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 191.0 253.0 253.0 253.0 0.0 0.0 0.0 0.0 0.0 0.0 12.0 174.0 253.0 253.0 219.0 39.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 67.0 236.0 251.0 251.0 191.0 190.0 111.0 72.0 190.0 191.0 197.0 251.0 243.0 121.0 39.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 63.0 236.0 251.0 253.0 251.0 251.0 251.0 251.0 253.0 251.0 188.0 94.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 27.0 129.0 253.0 251.0 251.0 251.0 251.0 229.0 168.0 15.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 95.0 212.0 251.0 211.0 94.0 59.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 31.0 144.0 250.0 254.0 166.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 98.0 241.0 204.0 97.0 126.0 253.0 40.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 121.0 247.0 133.0 16.0 0.0 50.0 253.0 27.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 103.0 253.0 109.0 0.0 0.0 0.0 120.0 231.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 18.0 234.0 169.0 4.0 0.0 0.0 31.0 220.0 231.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 215.0 212.0 18.0 0.0 0.0 0.0 195.0 254.0 139.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 88.0 253.0 63.0 0.0 0.0 0.0 90.0 251.0 242.0 23.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 183.0 214.0 5.0 0.0 0.0 24.0 233.0 253.0 133.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 124.0 0.0 0.0 14.0 197.0 253.0 149.0 14.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 67.0 254.0 45.0 0.0 71.0 224.0 254.0 218.0 15.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 45.0 246.0 214.0 227.0 248.0 241.0 255.0 111.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 94.0 193.0 167.0 78.0 226.0 189.0 8.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 145.0 249.0 53.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 253.0 130.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 230.0 227.0 12.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 52.0 250.0 104.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 8.0 206.0 223.0 11.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 105.0 253.0 45.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 214.0 207.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 232.0 106.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 121.0 254.0 136.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 13.0 230.0 253.0 248.0 99.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 118.0 253.0 253.0 225.0 42.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 61.0 253.0 253.0 253.0 74.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 32.0 206.0 253.0 253.0 186.0 9.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 211.0 253.0 253.0 239.0 69.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 253.0 253.0 133.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 142.0 255.0 253.0 186.0 8.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 149.0 229.0 254.0 207.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 54.0 229.0 253.0 254.0 105.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 152.0 254.0 254.0 213.0 26.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 112.0 251.0 253.0 253.0 26.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 29.0 212.0 253.0 250.0 149.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 36.0 214.0 253.0 253.0 137.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 75.0 253.0 253.0 253.0 59.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 93.0 253.0 253.0 189.0 17.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 224.0 253.0 253.0 84.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 43.0 235.0 253.0 126.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 99.0 248.0 253.0 119.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 225.0 235.0 49.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 166.0 222.0 55.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 197.0 254.0 218.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 29.0 249.0 254.0 254.0 9.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 45.0 254.0 254.0 174.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 164.0 254.0 254.0 85.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 146.0 254.0 254.0 254.0 85.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 101.0 245.0 254.0 254.0 254.0 85.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 97.0 248.0 254.0 204.0 254.0 254.0 85.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 12.0 59.0 98.0 151.0 237.0 254.0 254.0 109.0 35.0 254.0 254.0 85.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 41.0 216.0 254.0 254.0 239.0 153.0 37.0 4.0 32.0 254.0 254.0 85.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 7.0 44.0 44.0 30.0 0.0 0.0 0.0 32.0 254.0 254.0 96.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 19.0 230.0 254.0 174.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 197.0 254.0 110.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 197.0 254.0 85.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 197.0 253.0 63.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 37.0 54.0 54.0 45.0 26.0 84.0 221.0 84.0 21.0 31.0 162.0 78.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 41.0 141.0 244.0 254.0 254.0 248.0 236.0 254.0 254.0 254.0 233.0 239.0 254.0 138.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 23.0 167.0 254.0 254.0 254.0 254.0 229.0 228.0 185.0 138.0 138.0 138.0 138.0 138.0 138.0 44.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 113.0 254.0 254.0 254.0 179.0 64.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 32.0 209.0 183.0 97.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 83.0 91.0 143.0 255.0 190.0 91.0 50.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 9.0 49.0 180.0 246.0 253.0 253.0 253.0 253.0 253.0 220.0 154.0 17.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 46.0 107.0 178.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 126.0 45.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 107.0 253.0 253.0 253.0 253.0 223.0 220.0 220.0 220.0 220.0 245.0 253.0 253.0 253.0 253.0 106.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 107.0 173.0 253.0 229.0 129.0 12.0 0.0 0.0 0.0 0.0 110.0 253.0 253.0 253.0 253.0 106.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 17.0 14.0 40.0 32.0 0.0 0.0 0.0 0.0 0.0 0.0 57.0 253.0 253.0 253.0 242.0 85.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 139.0 224.0 253.0 253.0 253.0 105.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 65.0 178.0 253.0 253.0 253.0 253.0 219.0 24.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 97.0 250.0 253.0 253.0 253.0 253.0 127.0 47.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 46.0 125.0 250.0 253.0 253.0 253.0 245.0 171.0 33.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 41.0 217.0 253.0 253.0 250.0 245.0 245.0 115.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 124.0 253.0 253.0 253.0 192.0 105.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 47.0 220.0 253.0 253.0 188.0 25.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 107.0 253.0 253.0 253.0 189.0 13.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 41.0 225.0 253.0 253.0 186.0 22.0 0.0 0.0 0.0 0.0 0.0 31.0 42.0 174.0 205.0 205.0 205.0 193.0 58.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 48.0 218.0 253.0 253.0 253.0 150.0 59.0 0.0 0.0 128.0 131.0 131.0 222.0 253.0 253.0 253.0 253.0 253.0 94.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 12.0 152.0 253.0 253.0 253.0 253.0 236.0 222.0 222.0 252.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 122.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 7.0 167.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 124.0 106.0 7.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 76.0 188.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 224.0 57.0 15.0 15.0 15.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 12.0 89.0 121.0 253.0 253.0 151.0 89.0 89.0 55.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 30.0 229.0 44.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 38.0 30.0 0.0 0.0 0.0 0.0 0.0 181.0 223.0 31.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 81.0 242.0 113.0 0.0 0.0 0.0 0.0 57.0 249.0 129.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 172.0 162.0 0.0 0.0 0.0 0.0 0.0 136.0 253.0 46.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 231.0 138.0 0.0 0.0 0.0 0.0 0.0 162.0 254.0 46.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 26.0 239.0 137.0 0.0 0.0 0.0 0.0 0.0 245.0 244.0 38.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 222.0 148.0 7.0 0.0 0.0 0.0 0.0 254.0 206.0 3.0 7.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 138.0 253.0 169.0 34.0 0.0 0.0 0.0 254.0 240.0 191.0 69.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 17.0 174.0 254.0 255.0 169.0 161.0 195.0 255.0 254.0 113.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 90.0 173.0 206.0 206.0 223.0 254.0 77.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 93.0 254.0 23.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 127.0 254.0 23.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 7.0 204.0 210.0 9.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 24.0 253.0 134.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 99.0 253.0 51.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 149.0 253.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 47.0 254.0 195.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 253.0 143.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 138.0 234.0 13.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 138.0 196.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 9.0 80.0 207.0 255.0 254.0 254.0 254.0 97.0 80.0 80.0 44.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 39.0 158.0 158.0 158.0 168.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 210.0 38.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 226.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 241.0 146.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 139.0 253.0 253.0 253.0 238.0 113.0 215.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 210.0 43.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 39.0 34.0 34.0 34.0 30.0 0.0 31.0 148.0 34.0 204.0 235.0 253.0 253.0 253.0 253.0 253.0 236.0 64.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 91.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 35.0 199.0 253.0 253.0 253.0 253.0 244.0 81.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 33.0 202.0 202.0 216.0 253.0 253.0 253.0 253.0 241.0 89.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 167.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 238.0 82.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 27.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 96.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 18.0 201.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 230.0 49.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 36.0 87.0 87.0 87.0 248.0 253.0 253.0 253.0 253.0 138.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 7.0 152.0 253.0 253.0 253.0 250.0 59.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 62.0 238.0 253.0 253.0 253.0 60.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 32.0 233.0 253.0 253.0 150.0 6.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 37.0 203.0 253.0 253.0 253.0 138.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 66.0 211.0 211.0 211.0 59.0 36.0 36.0 21.0 26.0 36.0 151.0 222.0 253.0 253.0 253.0 253.0 138.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 80.0 253.0 253.0 253.0 253.0 253.0 253.0 195.0 215.0 253.0 253.0 253.0 253.0 253.0 253.0 157.0 77.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 80.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 237.0 235.0 40.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 49.0 156.0 247.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 159.0 156.0 16.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 116.0 253.0 253.0 253.0 253.0 253.0 126.0 78.0 78.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 80.0 189.0 254.0 255.0 254.0 254.0 254.0 174.0 101.0 31.0 50.0 12.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 80.0 242.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 216.0 226.0 206.0 200.0 200.0 58.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 101.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 227.0 53.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 251.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 249.0 181.0 17.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 122.0 214.0 214.0 158.0 61.0 61.0 113.0 214.0 214.0 250.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 45.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 105.0 115.0 115.0 237.0 253.0 253.0 253.0 253.0 253.0 129.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 13.0 24.0 168.0 241.0 253.0 253.0 199.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 102.0 243.0 253.0 253.0 87.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 16.0 253.0 253.0 253.0 197.0 22.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 22.0 182.0 253.0 253.0 251.0 101.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 99.0 198.0 253.0 253.0 247.0 129.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 99.0 253.0 253.0 253.0 253.0 191.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 117.0 224.0 244.0 253.0 253.0 239.0 30.0 23.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 58.0 169.0 213.0 253.0 253.0 253.0 197.0 79.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 86.0 253.0 253.0 253.0 242.0 137.0 16.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 216.0 253.0 253.0 253.0 141.0 62.0 8.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 239.0 253.0 253.0 253.0 253.0 253.0 172.0 162.0 162.0 162.0 64.0 8.0 7.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 80.0 247.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 199.0 66.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 95.0 199.0 227.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 220.0 230.0 201.0 235.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 52.0 99.0 99.0 174.0 253.0 253.0 253.0 122.0 39.0 57.0 22.0 99.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 37.0 37.0 37.0 7.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 78.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 14.0 84.0 182.0 188.0 193.0 254.0 254.0 254.0 124.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 9.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 22.0 91.0 130.0 193.0 254.0 254.0 204.0 125.0 201.0 254.0 254.0 246.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 214.0 254.0 255.0 254.0 255.0 173.0 22.0 0.0 98.0 254.0 255.0 152.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 213.0 245.0 198.0 75.0 31.0 2.0 0.0 117.0 245.0 254.0 221.0 25.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 72.0 36.0 0.0 0.0 0.0 0.0 78.0 246.0 254.0 222.0 33.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 117.0 243.0 254.0 225.0 37.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 77.0 249.0 254.0 220.0 73.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 75.0 242.0 254.0 224.0 37.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 75.0 251.0 254.0 219.0 33.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 77.0 242.0 254.0 254.0 40.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 29.0 209.0 254.0 232.0 83.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 20.0 226.0 254.0 224.0 63.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 63.0 254.0 250.0 58.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 47.0 244.0 174.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 30.0 14.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 19.0 95.0 143.0 143.0 143.0 143.0 143.0 143.0 143.0 143.0 33.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 90.0 149.0 208.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 217.0 22.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 253.0 251.0 222.0 222.0 161.0 140.0 99.0 99.0 99.0 99.0 143.0 253.0 253.0 113.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 217.0 210.0 86.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 29.0 161.0 253.0 253.0 82.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 33.0 203.0 253.0 253.0 174.0 13.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 10.0 78.0 232.0 253.0 253.0 253.0 43.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 138.0 253.0 253.0 253.0 253.0 253.0 192.0 180.0 180.0 128.0 32.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 174.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 169.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 42.0 61.0 61.0 61.0 61.0 83.0 176.0 79.0 110.0 247.0 253.0 195.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 59.0 192.0 30.0 0.0 0.0 50.0 203.0 253.0 42.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 56.0 195.0 57.0 0.0 0.0 0.0 0.0 112.0 253.0 229.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 172.0 204.0 17.0 0.0 0.0 0.0 0.0 58.0 248.0 253.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 192.0 253.0 184.0 62.0 0.0 0.0 85.0 164.0 253.0 253.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 144.0 253.0 253.0 243.0 223.0 223.0 250.0 253.0 253.0 96.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 7.0 152.0 253.0 253.0 253.0 253.0 253.0 253.0 152.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 18.0 122.0 141.0 141.0 141.0 87.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 42.0 154.0 180.0 255.0 176.0 118.0 118.0 16.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 142.0 253.0 253.0 253.0 253.0 253.0 253.0 236.0 103.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 227.0 253.0 253.0 204.0 177.0 177.0 177.0 243.0 191.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 227.0 253.0 216.0 22.0 0.0 0.0 23.0 227.0 238.0 96.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 227.0 253.0 205.0 0.0 0.0 17.0 124.0 253.0 253.0 253.0 170.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 227.0 253.0 234.0 62.0 18.0 201.0 253.0 253.0 253.0 251.0 90.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 227.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 221.0 103.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 227.0 253.0 253.0 253.0 253.0 253.0 208.0 24.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 39.0 236.0 253.0 253.0 253.0 251.0 97.0 16.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 69.0 224.0 253.0 253.0 240.0 169.0 46.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 33.0 134.0 253.0 253.0 253.0 253.0 105.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 51.0 225.0 253.0 253.0 253.0 253.0 253.0 68.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 48.0 227.0 253.0 253.0 250.0 174.0 253.0 253.0 68.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 213.0 253.0 253.0 179.0 63.0 111.0 253.0 253.0 68.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 92.0 251.0 201.0 13.0 5.0 0.0 166.0 253.0 253.0 68.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 39.0 222.0 253.0 198.0 0.0 0.0 0.0 248.0 253.0 231.0 46.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 54.0 243.0 253.0 124.0 0.0 38.0 133.0 252.0 253.0 150.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 118.0 253.0 253.0 237.0 179.0 223.0 253.0 253.0 190.0 14.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 44.0 230.0 253.0 253.0 253.0 253.0 253.0 244.0 76.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 45.0 231.0 253.0 253.0 253.0 182.0 66.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 132.0 255.0 225.0 12.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 128.0 246.0 183.0 128.0 46.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 91.0 254.0 134.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 54.0 235.0 204.0 7.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 158.0 252.0 120.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 63.0 251.0 165.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 107.0 254.0 138.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 182.0 229.0 40.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 17.0 232.0 133.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 133.0 254.0 105.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 216.0 254.0 27.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 18.0 227.0 194.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 30.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 58.0 254.0 115.0 0.0 0.0 0.0 0.0 25.0 139.0 155.0 242.0 235.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 58.0 254.0 75.0 0.0 0.0 0.0 83.0 224.0 251.0 155.0 152.0 254.0 211.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 58.0 254.0 104.0 0.0 0.0 82.0 249.0 217.0 60.0 0.0 37.0 254.0 120.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 58.0 254.0 72.0 0.0 18.0 247.0 159.0 14.0 0.0 7.0 201.0 254.0 69.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 35.0 239.0 147.0 1.0 5.0 155.0 72.0 0.0 4.0 193.0 253.0 122.0 6.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 216.0 254.0 97.0 0.0 0.0 13.0 73.0 225.0 254.0 121.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 79.0 244.0 248.0 226.0 226.0 231.0 254.0 243.0 115.0 6.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 114.0 177.0 254.0 254.0 235.0 152.0 43.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 45.0 103.0 254.0 254.0 255.0 184.0 73.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 85.0 169.0 245.0 253.0 253.0 253.0 253.0 253.0 230.0 97.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 91.0 233.0 253.0 160.0 89.0 95.0 232.0 253.0 253.0 253.0 125.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 187.0 253.0 117.0 7.0 0.0 6.0 136.0 242.0 253.0 251.0 112.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 200.0 253.0 113.0 2.0 76.0 75.0 194.0 253.0 253.0 159.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 177.0 253.0 239.0 228.0 216.0 253.0 253.0 253.0 173.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 27.0 200.0 253.0 253.0 253.0 253.0 253.0 253.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 14.0 15.0 102.0 253.0 253.0 159.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 41.0 216.0 253.0 190.0 19.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 30.0 153.0 253.0 248.0 51.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 94.0 253.0 252.0 120.0 17.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 47.0 250.0 252.0 148.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 25.0 182.0 253.0 203.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 206.0 253.0 220.0 50.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 92.0 252.0 244.0 106.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 50.0 226.0 241.0 109.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 40.0 235.0 253.0 137.0 24.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 15.0 208.0 253.0 190.0 29.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 30.0 218.0 240.0 146.0 6.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 160.0 167.0 70.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 53.0 255.0 253.0 253.0 253.0 124.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 180.0 253.0 251.0 251.0 251.0 251.0 145.0 62.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 32.0 217.0 241.0 253.0 251.0 251.0 251.0 251.0 253.0 107.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 37.0 251.0 251.0 253.0 251.0 251.0 251.0 251.0 253.0 107.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 166.0 251.0 251.0 253.0 251.0 96.0 148.0 251.0 253.0 107.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 73.0 253.0 253.0 253.0 253.0 130.0 0.0 0.0 110.0 253.0 255.0 108.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 73.0 251.0 251.0 251.0 251.0 0.0 0.0 0.0 109.0 251.0 253.0 107.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 202.0 251.0 251.0 251.0 225.0 0.0 0.0 6.0 129.0 251.0 253.0 107.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 150.0 251.0 251.0 251.0 71.0 0.0 0.0 115.0 251.0 251.0 253.0 107.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 253.0 251.0 251.0 173.0 20.0 0.0 0.0 217.0 251.0 251.0 253.0 107.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 182.0 255.0 253.0 216.0 0.0 0.0 0.0 0.0 218.0 253.0 253.0 182.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 63.0 221.0 253.0 251.0 215.0 0.0 0.0 0.0 84.0 236.0 251.0 251.0 77.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 109.0 251.0 253.0 251.0 215.0 0.0 0.0 11.0 160.0 251.0 251.0 96.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 109.0 251.0 253.0 251.0 137.0 0.0 0.0 150.0 251.0 251.0 251.0 71.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 109.0 251.0 253.0 251.0 35.0 0.0 130.0 253.0 251.0 251.0 173.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 110.0 253.0 255.0 253.0 98.0 150.0 253.0 255.0 253.0 164.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 109.0 251.0 253.0 251.0 251.0 251.0 251.0 253.0 251.0 35.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 93.0 241.0 253.0 251.0 251.0 251.0 251.0 216.0 112.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 103.0 253.0 251.0 251.0 251.0 251.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 124.0 251.0 225.0 71.0 71.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 29.0 141.0 198.0 255.0 198.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 86.0 141.0 198.0 255.0 255.0 255.0 255.0 170.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 29.0 141.0 226.0 255.0 255.0 255.0 255.0 198.0 86.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 170.0 255.0 255.0 170.0 86.0 86.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 141.0 226.0 170.0 57.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 86.0 255.0 198.0 29.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 198.0 255.0 141.0 86.0 57.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 170.0 255.0 198.0 114.0 226.0 170.0 29.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 57.0 198.0 255.0 114.0 29.0 0.0 141.0 255.0 29.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 114.0 255.0 114.0 0.0 0.0 0.0 141.0 255.0 29.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 29.0 0.0 0.0 0.0 0.0 226.0 255.0 29.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 114.0 255.0 141.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 86.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 114.0 226.0 226.0 29.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 198.0 86.0 0.0 0.0 0.0 141.0 255.0 255.0 170.0 29.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 226.0 255.0 226.0 170.0 226.0 255.0 255.0 198.0 29.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 86.0 198.0 255.0 255.0 170.0 141.0 57.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 71.0 191.0 122.0 70.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 147.0 253.0 254.0 191.0 11.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 74.0 242.0 253.0 254.0 253.0 26.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 35.0 239.0 253.0 253.0 254.0 162.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 146.0 253.0 253.0 253.0 187.0 37.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 139.0 233.0 253.0 253.0 253.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 187.0 253.0 253.0 251.0 142.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 43.0 229.0 253.0 253.0 155.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 145.0 253.0 253.0 253.0 107.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 201.0 253.0 253.0 253.0 107.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 39.0 227.0 254.0 254.0 254.0 176.0 121.0 122.0 6.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 81.0 253.0 253.0 253.0 253.0 253.0 253.0 254.0 242.0 191.0 17.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 81.0 253.0 253.0 253.0 253.0 253.0 253.0 254.0 253.0 253.0 119.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 55.0 237.0 253.0 253.0 253.0 206.0 173.0 254.0 253.0 253.0 253.0 187.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 201.0 253.0 253.0 253.0 145.0 32.0 53.0 208.0 253.0 253.0 253.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 60.0 240.0 253.0 253.0 253.0 253.0 218.0 54.0 209.0 253.0 253.0 253.0 199.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 26.0 196.0 253.0 253.0 253.0 253.0 253.0 255.0 253.0 253.0 253.0 243.0 98.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 25.0 197.0 253.0 253.0 253.0 253.0 255.0 253.0 253.0 253.0 172.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 23.0 128.0 241.0 253.0 253.0 255.0 253.0 253.0 199.0 22.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 13.0 120.0 190.0 183.0 196.0 120.0 19.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 73.0 253.0 227.0 73.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 73.0 251.0 251.0 251.0 174.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 16.0 166.0 228.0 251.0 251.0 251.0 122.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 62.0 220.0 253.0 251.0 251.0 251.0 251.0 79.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 79.0 231.0 253.0 251.0 251.0 251.0 251.0 232.0 77.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 145.0 253.0 253.0 253.0 255.0 253.0 253.0 253.0 253.0 255.0 108.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 144.0 251.0 251.0 251.0 253.0 168.0 107.0 169.0 251.0 253.0 189.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 27.0 89.0 236.0 251.0 235.0 215.0 164.0 15.0 6.0 129.0 251.0 253.0 251.0 35.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 47.0 211.0 253.0 251.0 251.0 142.0 0.0 0.0 0.0 37.0 251.0 251.0 253.0 251.0 35.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 109.0 251.0 253.0 251.0 251.0 142.0 0.0 0.0 0.0 11.0 148.0 251.0 253.0 251.0 164.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 150.0 253.0 255.0 211.0 25.0 0.0 0.0 0.0 0.0 11.0 150.0 253.0 255.0 211.0 25.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 140.0 251.0 251.0 253.0 107.0 0.0 0.0 0.0 0.0 0.0 37.0 251.0 251.0 211.0 46.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 190.0 251.0 251.0 253.0 128.0 5.0 0.0 0.0 0.0 0.0 37.0 251.0 251.0 51.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 115.0 251.0 251.0 253.0 188.0 20.0 0.0 0.0 32.0 109.0 129.0 251.0 173.0 103.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 217.0 251.0 251.0 201.0 30.0 0.0 0.0 0.0 73.0 251.0 251.0 251.0 71.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 166.0 253.0 253.0 255.0 149.0 73.0 150.0 253.0 255.0 253.0 253.0 143.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 140.0 251.0 251.0 253.0 251.0 251.0 251.0 251.0 253.0 251.0 230.0 61.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 190.0 251.0 251.0 253.0 251.0 251.0 251.0 251.0 242.0 215.0 55.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 189.0 251.0 253.0 251.0 251.0 251.0 173.0 103.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 31.0 200.0 253.0 251.0 96.0 71.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 8.0 29.0 29.0 88.0 89.0 126.0 126.0 126.0 126.0 126.0 121.0 29.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 168.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 176.0 19.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 175.0 204.0 197.0 197.0 197.0 197.0 197.0 197.0 197.0 197.0 200.0 254.0 254.0 75.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 10.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 193.0 254.0 139.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 15.0 254.0 254.0 53.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 15.0 254.0 254.0 53.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 95.0 254.0 254.0 53.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 112.0 254.0 224.0 16.0 0.0 75.0 83.0 83.0 83.0 83.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 41.0 49.0 67.0 229.0 254.0 252.0 241.0 241.0 253.0 254.0 242.0 193.0 111.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 74.0 112.0 180.0 207.0 247.0 254.0 254.0 254.0 254.0 252.0 240.0 213.0 143.0 69.0 35.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 20.0 233.0 254.0 254.0 254.0 254.0 254.0 254.0 225.0 254.0 254.0 80.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 14.0 218.0 254.0 135.0 115.0 22.0 19.0 19.0 30.0 229.0 254.0 19.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 74.0 91.0 8.0 0.0 0.0 0.0 0.0 0.0 207.0 254.0 19.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 207.0 254.0 19.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 193.0 255.0 19.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 112.0 254.0 19.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 112.0 254.0 19.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 18.0 59.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 128.0 255.0 120.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 33.0 162.0 253.0 253.0 179.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 174.0 253.0 253.0 248.0 105.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 38.0 220.0 253.0 253.0 113.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 23.0 220.0 253.0 253.0 253.0 61.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 38.0 253.0 253.0 253.0 195.0 23.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 120.0 253.0 253.0 195.0 23.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 161.0 253.0 219.0 24.0 0.0 0.0 0.0 16.0 153.0 128.0 31.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 23.0 227.0 253.0 116.0 0.0 0.0 0.0 54.0 203.0 253.0 253.0 224.0 17.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 123.0 253.0 243.0 61.0 0.0 0.0 17.0 179.0 253.0 253.0 253.0 253.0 24.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 155.0 253.0 210.0 0.0 0.0 0.0 162.0 253.0 253.0 196.0 149.0 253.0 24.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 20.0 232.0 253.0 173.0 0.0 0.0 0.0 192.0 253.0 229.0 30.0 94.0 253.0 24.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 25.0 253.0 253.0 86.0 0.0 0.0 51.0 242.0 229.0 57.0 0.0 193.0 253.0 24.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 25.0 253.0 253.0 189.0 0.0 20.0 188.0 253.0 136.0 0.0 116.0 247.0 219.0 16.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 16.0 217.0 253.0 247.0 69.0 56.0 253.0 253.0 128.0 132.0 247.0 219.0 37.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 155.0 253.0 253.0 233.0 230.0 253.0 253.0 253.0 253.0 253.0 112.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 30.0 215.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 123.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 30.0 141.0 218.0 253.0 253.0 168.0 106.0 18.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 33.0 219.0 253.0 61.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 180.0 192.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 178.0 255.0 105.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 188.0 253.0 216.0 14.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 14.0 202.0 253.0 253.0 23.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 12.0 199.0 253.0 128.0 6.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 42.0 253.0 253.0 158.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 42.0 253.0 253.0 158.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 155.0 253.0 253.0 158.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 160.0 253.0 253.0 147.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 160.0 253.0 253.0 41.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 17.0 225.0 253.0 235.0 31.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 24.0 253.0 253.0 176.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 24.0 253.0 253.0 176.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 24.0 253.0 253.0 176.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 24.0 253.0 253.0 176.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 24.0 253.0 253.0 162.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 46.0 253.0 253.0 59.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 142.0 253.0 253.0 59.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 142.0 253.0 253.0 59.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 142.0 253.0 202.0 8.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 87.0 253.0 139.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 116.0 244.0 114.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 43.0 47.0 47.0 34.0 0.0 116.0 253.0 206.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 19.0 164.0 246.0 253.0 252.0 234.0 33.0 116.0 253.0 174.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 60.0 188.0 252.0 252.0 253.0 252.0 252.0 45.0 210.0 234.0 17.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 74.0 244.0 252.0 252.0 147.0 148.0 210.0 22.0 140.0 250.0 230.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 253.0 205.0 21.0 0.0 64.0 140.0 169.0 233.0 253.0 158.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 253.0 252.0 154.0 9.0 0.0 0.0 68.0 252.0 252.0 178.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 137.0 252.0 252.0 196.0 48.0 49.0 228.0 252.0 227.0 48.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 177.0 252.0 252.0 232.0 233.0 252.0 227.0 50.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 15.0 137.0 252.0 252.0 253.0 231.0 48.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 81.0 253.0 253.0 255.0 207.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 51.0 228.0 252.0 231.0 232.0 236.0 44.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 49.0 228.0 252.0 227.0 48.0 138.0 252.0 152.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 233.0 252.0 227.0 50.0 0.0 138.0 252.0 208.0 17.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 158.0 253.0 252.0 79.0 0.0 0.0 138.0 252.0 221.0 25.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 93.0 253.0 255.0 144.0 0.0 0.0 0.0 149.0 253.0 173.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 166.0 252.0 249.0 75.0 0.0 0.0 43.0 253.0 223.0 25.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 207.0 252.0 237.0 70.0 70.0 112.0 246.0 253.0 174.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 165.0 252.0 253.0 252.0 252.0 252.0 252.0 150.0 17.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 51.0 137.0 253.0 252.0 200.0 210.0 32.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 26.0 111.0 195.0 230.0 30.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 28.0 107.0 195.0 254.0 254.0 254.0 244.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 46.0 167.0 248.0 254.0 222.0 146.0 150.0 254.0 174.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 65.0 223.0 246.0 254.0 153.0 61.0 10.0 0.0 48.0 254.0 129.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 85.0 175.0 164.0 80.0 2.0 0.0 0.0 0.0 48.0 254.0 120.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 182.0 254.0 16.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 207.0 254.0 16.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 207.0 202.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 28.0 248.0 170.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 107.0 254.0 61.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 166.0 252.0 30.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 191.0 206.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 191.0 206.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 14.0 246.0 186.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 91.0 254.0 77.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 175.0 254.0 48.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 175.0 240.0 27.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 215.0 222.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 115.0 255.0 152.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 134.0 255.0 68.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 31.0 193.0 254.0 253.0 254.0 213.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 41.0 173.0 252.0 253.0 252.0 253.0 252.0 183.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 92.0 233.0 244.0 203.0 102.0 20.0 72.0 253.0 142.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 233.0 212.0 81.0 0.0 21.0 102.0 193.0 171.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 123.0 254.0 151.0 0.0 0.0 62.0 122.0 254.0 151.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 203.0 253.0 151.0 0.0 0.0 0.0 183.0 253.0 111.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 41.0 254.0 213.0 152.0 71.0 173.0 253.0 224.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 172.0 252.0 253.0 252.0 253.0 252.0 203.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 82.0 163.0 203.0 214.0 253.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 253.0 252.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 82.0 254.0 233.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 41.0 243.0 253.0 70.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 72.0 253.0 203.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 41.0 233.0 252.0 81.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 123.0 254.0 233.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 223.0 253.0 111.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 173.0 253.0 142.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 82.0 253.0 212.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 213.0 255.0 131.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 51.0 252.0 192.0 30.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 163.0 132.0 51.0 51.0 51.0 51.0 51.0 51.0 51.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 203.0 253.0 252.0 253.0 252.0 253.0 252.0 253.0 252.0 223.0 203.0 41.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 103.0 142.0 203.0 203.0 203.0 203.0 203.0 203.0 214.0 253.0 204.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 51.0 252.0 162.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 253.0 82.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 123.0 253.0 130.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 132.0 253.0 203.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 123.0 253.0 252.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 113.0 253.0 224.0 61.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 152.0 252.0 223.0 102.0 102.0 61.0 41.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 62.0 142.0 203.0 243.0 254.0 253.0 254.0 253.0 82.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 40.0 71.0 111.0 172.0 252.0 203.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 72.0 253.0 203.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 152.0 252.0 81.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 102.0 254.0 213.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 203.0 253.0 130.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 173.0 253.0 163.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 163.0 253.0 171.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 113.0 172.0 132.0 253.0 142.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 51.0 232.0 151.0 70.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 185.0 255.0 253.0 253.0 230.0 132.0 132.0 31.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 9.0 71.0 242.0 252.0 252.0 228.0 231.0 252.0 252.0 252.0 167.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 28.0 166.0 252.0 252.0 235.0 92.0 0.0 14.0 142.0 252.0 252.0 150.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 12.0 204.0 252.0 234.0 152.0 44.0 0.0 0.0 48.0 225.0 252.0 180.0 16.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 12.0 164.0 252.0 232.0 61.0 0.0 0.0 0.0 6.0 179.0 252.0 252.0 60.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 49.0 252.0 252.0 76.0 0.0 0.0 0.0 44.0 199.0 252.0 252.0 252.0 60.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 89.0 252.0 228.0 32.0 0.0 0.0 99.0 231.0 244.0 220.0 252.0 203.0 12.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 169.0 252.0 207.0 97.0 97.0 206.0 234.0 243.0 32.0 157.0 252.0 145.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 60.0 252.0 252.0 252.0 252.0 252.0 200.0 22.0 11.0 198.0 231.0 41.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 26.0 131.0 224.0 252.0 252.0 142.0 11.0 0.0 82.0 252.0 204.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 13.0 253.0 253.0 141.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 82.0 252.0 220.0 36.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 208.0 252.0 96.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 24.0 253.0 247.0 78.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 121.0 253.0 199.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 32.0 216.0 244.0 26.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 207.0 252.0 241.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 33.0 200.0 249.0 252.0 92.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 85.0 252.0 252.0 142.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 85.0 252.0 200.0 11.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 152.0 203.0 181.0 141.0 58.0 17.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 40.0 172.0 247.0 188.0 232.0 234.0 35.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 17.0 82.0 101.0 143.0 252.0 245.0 67.0 35.0 225.0 214.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 132.0 237.0 254.0 254.0 254.0 254.0 254.0 243.0 80.0 210.0 248.0 35.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 163.0 251.0 211.0 107.0 23.0 36.0 120.0 240.0 246.0 98.0 218.0 143.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 47.0 251.0 166.0 0.0 0.0 0.0 0.0 0.0 16.0 43.0 189.0 212.0 25.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 40.0 250.0 214.0 14.0 0.0 0.0 0.0 0.0 10.0 148.0 250.0 99.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 137.0 254.0 234.0 103.0 6.0 0.0 0.0 154.0 225.0 85.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 44.0 195.0 254.0 184.0 24.0 129.0 235.0 35.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 101.0 240.0 254.0 254.0 66.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 172.0 254.0 254.0 108.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 154.0 253.0 98.0 190.0 254.0 104.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 91.0 254.0 131.0 0.0 13.0 212.0 225.0 64.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 20.0 238.0 254.0 29.0 0.0 0.0 55.0 244.0 195.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 90.0 254.0 219.0 6.0 0.0 0.0 0.0 100.0 254.0 111.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 127.0 254.0 116.0 0.0 0.0 0.0 0.0 23.0 248.0 126.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 127.0 254.0 63.0 0.0 0.0 0.0 0.0 49.0 252.0 126.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 124.0 248.0 29.0 0.0 0.0 0.0 38.0 167.0 254.0 101.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 29.0 233.0 211.0 115.0 115.0 135.0 254.0 244.0 130.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 70.0 236.0 254.0 254.0 254.0 173.0 38.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 128.0 255.0 255.0 255.0 255.0 255.0 64.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 255.0 255.0 255.0 255.0 255.0 255.0 255.0 255.0 255.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 255.0 255.0 255.0 255.0 255.0 255.0 255.0 191.0 128.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 255.0 191.0 128.0 128.0 64.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 128.0 0.0 0.0 64.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 191.0 255.0 255.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 255.0 255.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 255.0 191.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 255.0 255.0 191.0 128.0 64.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 255.0 255.0 255.0 255.0 255.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 128.0 255.0 255.0 255.0 64.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 191.0 255.0 255.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 255.0 191.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 191.0 255.0 191.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 191.0 64.0 0.0 0.0 64.0 255.0 255.0 255.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 255.0 255.0 255.0 255.0 255.0 255.0 255.0 255.0 191.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 255.0 255.0 255.0 255.0 255.0 255.0 255.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 255.0 255.0 128.0 191.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 50.0 209.0 255.0 172.0 15.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 48.0 236.0 254.0 247.0 252.0 74.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 109.0 254.0 237.0 31.0 149.0 240.0 31.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 109.0 254.0 137.0 0.0 126.0 254.0 121.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 109.0 254.0 137.0 0.0 126.0 254.0 121.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 109.0 254.0 137.0 0.0 126.0 254.0 156.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 100.0 254.0 189.0 86.0 210.0 254.0 226.0 15.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 159.0 254.0 254.0 196.0 169.0 254.0 99.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 50.0 50.0 25.0 90.0 254.0 191.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 9.0 182.0 254.0 70.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 83.0 248.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 205.0 207.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 137.0 254.0 25.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 137.0 254.0 71.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 137.0 254.0 108.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 137.0 254.0 108.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 69.0 220.0 198.0 102.0 0.0 0.0 137.0 254.0 108.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 137.0 219.0 214.0 252.0 129.0 36.0 162.0 254.0 108.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 34.0 5.0 44.0 199.0 254.0 250.0 253.0 235.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 117.0 242.0 254.0 114.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 63.0 114.0 238.0 253.0 253.0 253.0 255.0 27.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 98.0 225.0 240.0 253.0 252.0 252.0 252.0 252.0 253.0 228.0 225.0 130.0 38.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 26.0 6.0 0.0 0.0 0.0 0.0 67.0 240.0 252.0 252.0 253.0 252.0 252.0 252.0 252.0 253.0 252.0 252.0 252.0 112.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 101.0 24.0 0.0 0.0 0.0 0.0 28.0 121.0 249.0 239.0 253.0 236.0 204.0 112.0 189.0 253.0 252.0 252.0 217.0 37.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 25.0 99.0 63.0 112.0 50.0 159.0 252.0 252.0 253.0 252.0 220.0 37.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 63.0 114.0 238.0 253.0 253.0 253.0 255.0 152.0 110.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 19.0 101.0 240.0 253.0 252.0 252.0 252.0 204.0 106.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 166.0 252.0 252.0 253.0 252.0 176.0 55.0 25.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 181.0 252.0 252.0 253.0 252.0 155.0 26.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 25.0 112.0 112.0 174.0 252.0 252.0 239.0 63.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 126.0 229.0 253.0 253.0 114.0 12.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 53.0 177.0 252.0 253.0 27.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 22.0 227.0 253.0 136.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 19.0 215.0 253.0 89.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 107.0 252.0 253.0 167.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 92.0 253.0 255.0 27.0 0.0 0.0 63.0 114.0 113.0 222.0 253.0 253.0 204.0 15.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 51.0 243.0 252.0 253.0 103.0 85.0 178.0 240.0 253.0 252.0 252.0 252.0 252.0 94.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 13.0 155.0 252.0 253.0 252.0 252.0 252.0 252.0 253.0 252.0 239.0 180.0 55.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 26.0 239.0 253.0 252.0 252.0 249.0 223.0 225.0 99.0 65.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 63.0 174.0 252.0 141.0 99.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 12.0 56.0 140.0 126.0 175.0 200.0 96.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 35.0 166.0 238.0 254.0 246.0 242.0 253.0 246.0 254.0 67.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 184.0 182.0 146.0 127.0 70.0 30.0 45.0 36.0 215.0 175.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 30.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 207.0 246.0 14.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 55.0 251.0 169.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 215.0 232.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 20.0 190.0 250.0 61.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 24.0 118.0 206.0 254.0 248.0 142.0 108.0 18.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 63.0 223.0 254.0 254.0 254.0 254.0 254.0 254.0 209.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 52.0 174.0 129.0 95.0 16.0 16.0 16.0 106.0 249.0 125.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 179.0 239.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 80.0 239.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 80.0 244.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 100.0 239.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 234.0 239.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 140.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 150.0 254.0 129.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 254.0 181.0 38.0 0.0 0.0 0.0 0.0 34.0 188.0 254.0 209.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 12.0 226.0 255.0 223.0 88.0 68.0 128.0 157.0 242.0 254.0 207.0 23.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 45.0 210.0 254.0 254.0 254.0 254.0 255.0 254.0 187.0 49.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 41.0 129.0 239.0 229.0 179.0 91.0 16.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 46.0 105.0 254.0 254.0 254.0 254.0 255.0 239.0 41.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 37.0 118.0 222.0 254.0 253.0 253.0 253.0 253.0 253.0 253.0 211.0 54.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 14.0 200.0 253.0 253.0 254.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 116.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 16.0 160.0 236.0 253.0 253.0 253.0 254.0 253.0 253.0 246.0 229.0 253.0 253.0 253.0 116.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 99.0 253.0 253.0 253.0 253.0 253.0 254.0 253.0 253.0 213.0 99.0 253.0 253.0 253.0 116.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 25.0 194.0 253.0 253.0 253.0 253.0 131.0 97.0 169.0 253.0 93.0 99.0 253.0 253.0 253.0 116.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 206.0 253.0 253.0 251.0 233.0 127.0 9.0 0.0 18.0 38.0 3.0 15.0 171.0 253.0 253.0 116.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 55.0 240.0 253.0 253.0 233.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 31.0 186.0 253.0 253.0 116.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 176.0 253.0 253.0 253.0 127.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 99.0 253.0 253.0 253.0 116.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 176.0 253.0 253.0 131.0 9.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 99.0 253.0 253.0 253.0 116.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 119.0 254.0 254.0 232.0 75.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 158.0 254.0 254.0 117.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 118.0 253.0 253.0 154.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 156.0 253.0 253.0 116.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 118.0 253.0 253.0 154.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 156.0 253.0 253.0 116.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 46.0 222.0 253.0 253.0 154.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 7.0 116.0 246.0 253.0 180.0 9.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 118.0 253.0 253.0 154.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 116.0 253.0 253.0 253.0 174.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 118.0 253.0 253.0 154.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 110.0 246.0 253.0 253.0 240.0 67.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 118.0 253.0 253.0 238.0 215.0 49.0 20.0 20.0 20.0 66.0 215.0 241.0 253.0 245.0 233.0 64.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 82.0 229.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 254.0 253.0 253.0 240.0 107.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 176.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 254.0 253.0 253.0 108.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 40.0 239.0 253.0 253.0 253.0 253.0 253.0 253.0 254.0 161.0 57.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 109.0 109.0 109.0 109.0 110.0 109.0 129.0 253.0 110.0 109.0 31.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 94.0 217.0 252.0 252.0 252.0 252.0 253.0 252.0 252.0 252.0 253.0 252.0 227.0 134.0 42.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 176.0 252.0 252.0 252.0 252.0 252.0 252.0 253.0 252.0 252.0 252.0 253.0 252.0 252.0 252.0 222.0 139.0 11.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 217.0 252.0 252.0 252.0 128.0 108.0 108.0 108.0 108.0 108.0 108.0 108.0 232.0 252.0 252.0 253.0 252.0 71.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 42.0 159.0 252.0 252.0 210.0 31.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 37.0 252.0 253.0 252.0 71.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 119.0 210.0 252.0 124.0 31.0 0.0 0.0 0.0 0.0 0.0 0.0 37.0 252.0 253.0 231.0 51.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 31.0 195.0 195.0 31.0 0.0 0.0 0.0 0.0 0.0 0.0 140.0 252.0 253.0 158.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 42.0 221.0 252.0 191.0 15.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 218.0 253.0 253.0 84.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 94.0 247.0 252.0 210.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 212.0 252.0 226.0 31.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 144.0 253.0 252.0 132.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 99.0 253.0 255.0 222.0 41.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 201.0 252.0 253.0 55.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 94.0 252.0 252.0 175.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 217.0 252.0 252.0 62.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 171.0 253.0 253.0 170.0 110.0 78.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 253.0 252.0 252.0 252.0 253.0 55.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 253.0 252.0 252.0 252.0 154.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 253.0 252.0 252.0 168.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 42.0 164.0 252.0 63.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 23.0 34.0 0.0 244.0 254.0 112.0 0.0 0.0 0.0 0.0 85.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 190.0 225.0 0.0 255.0 185.0 13.0 0.0 0.0 0.0 0.0 95.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 170.0 254.0 197.0 64.0 254.0 59.0 0.0 0.0 0.0 0.0 0.0 95.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 9.0 132.0 254.0 204.0 23.0 112.0 254.0 28.0 0.0 0.0 0.0 0.0 0.0 77.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 167.0 254.0 216.0 58.0 24.0 242.0 225.0 16.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 76.0 254.0 254.0 162.0 85.0 138.0 254.0 188.0 0.0 0.0 0.0 48.0 85.0 25.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 159.0 254.0 254.0 254.0 254.0 254.0 228.0 151.0 151.0 214.0 250.0 254.0 75.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 7.0 79.0 131.0 158.0 254.0 254.0 226.0 225.0 225.0 225.0 190.0 148.0 39.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 127.0 254.0 148.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 71.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 23.0 248.0 201.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 36.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 85.0 254.0 118.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 12.0 189.0 227.0 22.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 114.0 254.0 103.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 44.0 226.0 175.0 8.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 148.0 203.0 59.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 26.0 242.0 140.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 131.0 169.0 22.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 19.0 233.0 65.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 174.0 109.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 49.0 125.0 235.0 255.0 254.0 122.0 0.0 0.0 0.0 0.0 0.0 13.0 134.0 180.0 57.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 163.0 250.0 253.0 253.0 253.0 253.0 252.0 63.0 0.0 0.0 0.0 16.0 199.0 253.0 253.0 117.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 52.0 168.0 252.0 253.0 213.0 32.0 12.0 49.0 109.0 3.0 0.0 0.0 0.0 157.0 253.0 253.0 183.0 6.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 171.0 253.0 103.0 19.0 12.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 91.0 247.0 253.0 235.0 8.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 248.0 253.0 19.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 189.0 245.0 253.0 243.0 77.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 201.0 253.0 104.0 9.0 0.0 0.0 0.0 0.0 71.0 122.0 228.0 253.0 253.0 253.0 113.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 18.0 199.0 253.0 219.0 215.0 215.0 215.0 215.0 245.0 253.0 253.0 253.0 253.0 182.0 15.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 20.0 165.0 205.0 253.0 253.0 253.0 191.0 175.0 193.0 253.0 253.0 221.0 16.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 20.0 51.0 51.0 51.0 11.0 0.0 59.0 253.0 253.0 110.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 93.0 253.0 218.0 19.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 80.0 237.0 253.0 111.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 196.0 253.0 215.0 22.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 13.0 206.0 243.0 98.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 93.0 253.0 194.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 51.0 235.0 253.0 111.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 79.0 253.0 246.0 58.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 155.0 253.0 178.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 135.0 253.0 68.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 79.0 253.0 253.0 131.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 39.0 159.0 152.0 32.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 29.0 130.0 130.0 225.0 255.0 255.0 109.0 7.0 116.0 243.0 200.0 6.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 8.0 95.0 217.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 248.0 11.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 27.0 213.0 253.0 253.0 240.0 143.0 111.0 152.0 253.0 253.0 253.0 253.0 194.0 62.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 27.0 213.0 253.0 215.0 105.0 31.0 0.0 7.0 153.0 253.0 253.0 253.0 244.0 73.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 149.0 253.0 230.0 34.0 0.0 0.0 0.0 69.0 253.0 253.0 253.0 253.0 79.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 149.0 253.0 221.0 13.0 0.0 0.0 28.0 156.0 253.0 253.0 253.0 176.0 11.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 63.0 236.0 253.0 175.0 14.0 0.0 186.0 253.0 253.0 253.0 196.0 13.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 71.0 253.0 253.0 174.0 50.0 199.0 253.0 253.0 237.0 74.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 9.0 92.0 234.0 253.0 253.0 253.0 253.0 237.0 74.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 77.0 253.0 253.0 253.0 236.0 75.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 161.0 253.0 253.0 253.0 151.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 10.0 101.0 253.0 253.0 237.0 233.0 158.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 131.0 253.0 253.0 173.0 38.0 186.0 185.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 125.0 237.0 253.0 114.0 14.0 0.0 186.0 185.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 62.0 238.0 253.0 176.0 13.0 0.0 21.0 211.0 185.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 240.0 253.0 226.0 11.0 0.0 0.0 165.0 253.0 136.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 126.0 253.0 243.0 69.0 0.0 0.0 97.0 246.0 227.0 36.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 136.0 253.0 178.0 112.0 112.0 194.0 248.0 253.0 76.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 136.0 253.0 253.0 253.0 253.0 253.0 253.0 142.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 15.0 253.0 253.0 253.0 235.0 129.0 45.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 56.0 105.0 220.0 254.0 63.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 18.0 166.0 233.0 253.0 253.0 253.0 236.0 209.0 209.0 209.0 77.0 18.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 84.0 253.0 253.0 253.0 253.0 253.0 254.0 253.0 253.0 253.0 253.0 172.0 8.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 57.0 238.0 253.0 253.0 253.0 253.0 253.0 254.0 253.0 253.0 253.0 253.0 253.0 119.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 14.0 238.0 253.0 253.0 253.0 253.0 253.0 253.0 179.0 196.0 253.0 253.0 253.0 253.0 238.0 12.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 33.0 253.0 253.0 253.0 253.0 253.0 248.0 134.0 0.0 18.0 83.0 237.0 253.0 253.0 253.0 14.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 164.0 253.0 253.0 253.0 253.0 253.0 128.0 0.0 0.0 0.0 0.0 57.0 119.0 214.0 253.0 94.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 57.0 248.0 253.0 253.0 253.0 126.0 14.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 179.0 253.0 248.0 56.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 175.0 253.0 253.0 240.0 190.0 28.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 179.0 253.0 253.0 173.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 209.0 253.0 253.0 178.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 92.0 253.0 253.0 208.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 211.0 254.0 254.0 179.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 135.0 255.0 209.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 209.0 253.0 253.0 90.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 134.0 253.0 208.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 209.0 253.0 253.0 178.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 142.0 253.0 208.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 209.0 253.0 253.0 214.0 35.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 30.0 253.0 253.0 208.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 165.0 253.0 253.0 253.0 215.0 36.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 163.0 253.0 253.0 164.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 18.0 172.0 253.0 253.0 253.0 214.0 127.0 7.0 0.0 0.0 0.0 0.0 0.0 72.0 232.0 253.0 171.0 17.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 8.0 182.0 253.0 253.0 253.0 253.0 162.0 56.0 0.0 0.0 0.0 64.0 240.0 253.0 253.0 14.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 7.0 173.0 253.0 253.0 253.0 253.0 245.0 241.0 239.0 239.0 246.0 253.0 225.0 14.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 18.0 59.0 138.0 224.0 253.0 253.0 254.0 253.0 253.0 253.0 240.0 96.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 37.0 104.0 192.0 255.0 253.0 253.0 182.0 73.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 41.0 152.0 233.0 254.0 213.0 82.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 123.0 243.0 253.0 252.0 253.0 252.0 243.0 81.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 132.0 253.0 254.0 213.0 142.0 61.0 31.0 233.0 254.0 131.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 203.0 253.0 212.0 50.0 10.0 0.0 41.0 132.0 252.0 172.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 153.0 253.0 163.0 0.0 0.0 0.0 0.0 102.0 254.0 253.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 193.0 252.0 0.0 0.0 0.0 0.0 0.0 142.0 253.0 252.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 151.0 0.0 0.0 0.0 0.0 132.0 253.0 254.0 233.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 253.0 232.0 183.0 102.0 102.0 183.0 253.0 252.0 253.0 111.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 203.0 243.0 254.0 253.0 254.0 213.0 152.0 253.0 224.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 40.0 151.0 151.0 91.0 10.0 152.0 252.0 162.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 163.0 254.0 192.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 203.0 253.0 70.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 132.0 253.0 142.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 41.0 253.0 252.0 61.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 72.0 253.0 254.0 91.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 193.0 252.0 91.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 123.0 255.0 192.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 82.0 243.0 233.0 50.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 153.0 253.0 183.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 152.0 212.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 125.0 254.0 210.0 89.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 132.0 47.0 0.0 0.0 0.0 0.0 0.0 7.0 243.0 253.0 253.0 191.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 17.0 95.0 237.0 232.0 5.0 0.0 0.0 0.0 0.0 7.0 253.0 253.0 253.0 191.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 56.0 253.0 253.0 253.0 6.0 0.0 0.0 0.0 0.0 7.0 253.0 253.0 253.0 191.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 56.0 253.0 253.0 253.0 6.0 0.0 0.0 0.0 0.0 7.0 253.0 253.0 253.0 191.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 56.0 253.0 253.0 253.0 6.0 0.0 0.0 0.0 0.0 7.0 253.0 253.0 253.0 191.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 56.0 253.0 253.0 253.0 77.0 0.0 0.0 0.0 0.0 7.0 253.0 253.0 253.0 191.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 116.0 253.0 253.0 253.0 191.0 12.0 0.0 81.0 111.0 189.0 253.0 253.0 253.0 191.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 192.0 253.0 253.0 253.0 253.0 230.0 227.0 246.0 253.0 253.0 253.0 253.0 253.0 68.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 62.0 242.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 54.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 182.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 237.0 70.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 20.0 107.0 226.0 226.0 226.0 226.0 226.0 125.0 104.0 241.0 253.0 253.0 224.0 172.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 144.0 253.0 253.0 253.0 191.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 78.0 253.0 253.0 253.0 191.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 137.0 253.0 253.0 253.0 191.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 144.0 253.0 253.0 253.0 191.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 22.0 230.0 253.0 253.0 253.0 191.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 28.0 253.0 253.0 253.0 253.0 191.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 26.0 244.0 253.0 253.0 201.0 72.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 70.0 253.0 253.0 97.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 7.0 176.0 254.0 224.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 51.0 253.0 253.0 223.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 170.0 253.0 253.0 214.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 131.0 253.0 253.0 217.0 39.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 209.0 253.0 253.0 134.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 75.0 240.0 253.0 239.0 26.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 184.0 253.0 245.0 63.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 142.0 255.0 253.0 185.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 62.0 229.0 254.0 242.0 73.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 54.0 229.0 253.0 254.0 105.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 152.0 254.0 254.0 213.0 26.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 32.0 243.0 253.0 253.0 115.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 142.0 253.0 253.0 155.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 30.0 253.0 253.0 232.0 55.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 75.0 253.0 253.0 164.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 72.0 232.0 253.0 189.0 17.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 224.0 253.0 253.0 163.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 43.0 235.0 253.0 253.0 195.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 28.0 231.0 253.0 253.0 184.0 14.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 225.0 253.0 253.0 75.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 53.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 84.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 71.0 235.0 213.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 88.0 248.0 169.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 72.0 234.0 253.0 253.0 6.0 0.0 0.0 0.0 0.0 0.0 0.0 81.0 246.0 238.0 161.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 201.0 253.0 251.0 147.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 220.0 253.0 217.0 13.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 158.0 253.0 253.0 157.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 220.0 253.0 253.0 96.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 50.0 234.0 253.0 235.0 50.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 220.0 253.0 253.0 96.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 51.0 239.0 253.0 253.0 85.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 160.0 253.0 253.0 229.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 118.0 253.0 253.0 204.0 9.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 9.0 205.0 253.0 232.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 229.0 253.0 233.0 70.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 199.0 253.0 238.0 32.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 253.0 177.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 24.0 49.0 49.0 210.0 253.0 253.0 216.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 253.0 227.0 135.0 28.0 28.0 28.0 28.0 77.0 165.0 165.0 165.0 165.0 208.0 253.0 253.0 253.0 253.0 253.0 238.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 173.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 241.0 50.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 166.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 192.0 129.0 129.0 227.0 253.0 165.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 13.0 118.0 150.0 150.0 150.0 91.0 62.0 113.0 13.0 13.0 13.0 7.0 0.0 0.0 199.0 253.0 96.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 45.0 229.0 253.0 96.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 199.0 253.0 96.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 177.0 201.0 28.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 24.0 28.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 115.0 237.0 169.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 164.0 252.0 230.0 46.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 52.0 254.0 254.0 103.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 102.0 159.0 20.0 0.0 12.0 214.0 254.0 159.0 16.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 48.0 243.0 238.0 29.0 0.0 178.0 254.0 159.0 15.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 16.0 160.0 254.0 183.0 0.0 37.0 238.0 239.0 16.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 144.0 254.0 235.0 53.0 0.0 227.0 254.0 119.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 102.0 252.0 235.0 119.0 0.0 78.0 254.0 175.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 83.0 231.0 254.0 178.0 120.0 133.0 244.0 254.0 49.0 0.0 48.0 90.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 169.0 254.0 254.0 254.0 254.0 254.0 254.0 255.0 244.0 188.0 232.0 113.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 29.0 95.0 95.0 127.0 228.0 254.0 230.0 189.0 188.0 188.0 160.0 42.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 45.0 239.0 239.0 42.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 127.0 251.0 113.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 83.0 254.0 197.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 9.0 174.0 238.0 56.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 125.0 254.0 162.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 208.0 247.0 50.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 236.0 143.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 9.0 238.0 151.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 20.0 205.0 164.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 29.0 218.0 255.0 234.0 45.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 31.0 216.0 253.0 253.0 253.0 218.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 69.0 244.0 253.0 253.0 196.0 253.0 220.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 33.0 214.0 253.0 253.0 205.0 9.0 176.0 220.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 196.0 253.0 253.0 230.0 57.0 0.0 17.0 22.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 122.0 248.0 253.0 230.0 58.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 78.0 248.0 253.0 253.0 144.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 92.0 253.0 253.0 194.0 11.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 28.0 204.0 253.0 253.0 144.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 99.0 253.0 253.0 233.0 57.0 100.0 196.0 196.0 196.0 175.0 57.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 195.0 253.0 253.0 193.0 181.0 253.0 253.0 253.0 253.0 253.0 228.0 23.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 228.0 253.0 253.0 253.0 253.0 253.0 184.0 98.0 210.0 253.0 253.0 191.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 228.0 253.0 253.0 253.0 240.0 174.0 20.0 0.0 46.0 253.0 253.0 227.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 228.0 253.0 253.0 253.0 181.0 0.0 0.0 0.0 66.0 253.0 253.0 139.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 228.0 253.0 198.0 198.0 91.0 0.0 0.0 34.0 226.0 253.0 249.0 85.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 228.0 253.0 221.0 28.0 0.0 0.0 7.0 140.0 253.0 253.0 207.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 151.0 253.0 253.0 168.0 46.0 54.0 174.0 253.0 253.0 220.0 37.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 43.0 229.0 253.0 253.0 253.0 253.0 253.0 253.0 251.0 80.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 42.0 227.0 252.0 253.0 253.0 253.0 252.0 135.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 102.0 159.0 152.0 123.0 98.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 176.0 253.0 253.0 124.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 105.0 176.0 251.0 251.0 251.0 251.0 105.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 58.0 217.0 241.0 253.0 251.0 251.0 251.0 251.0 243.0 113.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 63.0 231.0 251.0 251.0 253.0 251.0 251.0 251.0 251.0 253.0 251.0 113.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 144.0 251.0 251.0 251.0 253.0 251.0 251.0 251.0 251.0 253.0 251.0 215.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 125.0 253.0 253.0 253.0 253.0 255.0 253.0 253.0 253.0 253.0 255.0 253.0 227.0 42.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 253.0 251.0 251.0 251.0 251.0 253.0 251.0 251.0 251.0 251.0 253.0 251.0 251.0 142.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 27.0 253.0 251.0 251.0 235.0 241.0 253.0 251.0 246.0 137.0 35.0 98.0 251.0 251.0 236.0 61.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 47.0 211.0 253.0 251.0 235.0 82.0 103.0 253.0 251.0 137.0 0.0 0.0 73.0 251.0 251.0 251.0 71.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 27.0 211.0 251.0 253.0 251.0 86.0 0.0 0.0 72.0 71.0 10.0 0.0 0.0 73.0 251.0 251.0 173.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 89.0 253.0 253.0 255.0 253.0 35.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 73.0 253.0 253.0 253.0 72.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 84.0 236.0 251.0 251.0 253.0 251.0 138.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 73.0 251.0 251.0 251.0 71.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 63.0 236.0 251.0 251.0 251.0 227.0 251.0 246.0 138.0 11.0 0.0 0.0 0.0 16.0 37.0 228.0 251.0 246.0 137.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 73.0 251.0 251.0 251.0 173.0 42.0 142.0 142.0 142.0 41.0 0.0 0.0 0.0 109.0 251.0 253.0 251.0 137.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 73.0 251.0 251.0 173.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 27.0 211.0 251.0 253.0 147.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 73.0 253.0 253.0 143.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 176.0 253.0 253.0 253.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 73.0 251.0 251.0 205.0 144.0 0.0 0.0 0.0 0.0 0.0 176.0 251.0 251.0 188.0 107.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 62.0 236.0 251.0 251.0 251.0 218.0 217.0 217.0 217.0 217.0 253.0 230.0 189.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 83.0 158.0 251.0 251.0 253.0 251.0 251.0 251.0 251.0 253.0 107.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 37.0 251.0 251.0 253.0 251.0 251.0 251.0 122.0 72.0 30.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 100.0 237.0 121.0 0.0 0.0 0.0 0.0 0.0 0.0 13.0 48.0 18.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 132.0 235.0 254.0 202.0 0.0 0.0 0.0 0.0 0.0 8.0 179.0 254.0 94.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 224.0 254.0 237.0 48.0 0.0 0.0 0.0 0.0 0.0 10.0 209.0 254.0 94.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 224.0 254.0 112.0 0.0 0.0 0.0 0.0 0.0 0.0 16.0 233.0 251.0 63.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 49.0 240.0 222.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 118.0 254.0 191.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 19.0 231.0 255.0 120.0 0.0 0.0 0.0 0.0 0.0 0.0 23.0 205.0 254.0 111.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 168.0 255.0 241.0 47.0 0.0 0.0 0.0 0.0 0.0 0.0 85.0 254.0 254.0 36.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 84.0 254.0 254.0 67.0 0.0 0.0 0.0 0.0 0.0 0.0 8.0 200.0 254.0 184.0 13.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 172.0 254.0 221.0 18.0 0.0 0.0 0.0 0.0 0.0 0.0 120.0 254.0 246.0 48.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 162.0 254.0 238.0 30.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 157.0 254.0 212.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 116.0 253.0 254.0 105.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 112.0 252.0 254.0 129.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 198.0 254.0 172.0 1.0 0.0 0.0 0.0 36.0 107.0 146.0 249.0 253.0 254.0 210.0 13.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 198.0 254.0 134.0 10.0 89.0 96.0 193.0 245.0 254.0 254.0 254.0 254.0 254.0 140.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 198.0 254.0 244.0 241.0 254.0 254.0 254.0 254.0 223.0 140.0 252.0 254.0 169.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 137.0 252.0 254.0 254.0 254.0 218.0 176.0 88.0 0.0 0.0 250.0 254.0 120.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 25.0 60.0 119.0 26.0 14.0 0.0 0.0 0.0 9.0 251.0 254.0 25.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 100.0 254.0 194.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 189.0 254.0 166.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 203.0 254.0 166.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 78.0 253.0 124.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 37.0 37.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 8.0 51.0 110.0 160.0 207.0 253.0 253.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 53.0 136.0 212.0 253.0 254.0 253.0 253.0 253.0 188.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 63.0 80.0 195.0 255.0 254.0 254.0 222.0 181.0 182.0 181.0 135.0 52.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 16.0 223.0 250.0 253.0 253.0 254.0 182.0 18.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 133.0 228.0 253.0 247.0 216.0 151.0 69.0 16.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 58.0 253.0 254.0 253.0 116.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 38.0 227.0 254.0 253.0 227.0 87.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 33.0 182.0 249.0 254.0 203.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 67.0 253.0 215.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 68.0 253.0 157.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 135.0 92.0 0.0 0.0 0.0 0.0 184.0 253.0 125.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 218.0 46.0 0.0 0.0 27.0 242.0 253.0 54.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 170.0 254.0 254.0 215.0 228.0 255.0 254.0 133.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 31.0 160.0 206.0 253.0 214.0 140.0 108.0 16.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 36.0 11.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 191.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 255.0 191.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 191.0 255.0 255.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 191.0 255.0 255.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 191.0 255.0 255.0 191.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 255.0 255.0 255.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 255.0 255.0 255.0 64.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 191.0 255.0 255.0 64.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 191.0 255.0 255.0 64.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 255.0 255.0 191.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 191.0 255.0 255.0 128.0 128.0 128.0 128.0 128.0 128.0 128.0 64.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 255.0 255.0 255.0 255.0 255.0 255.0 255.0 255.0 255.0 255.0 255.0 64.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 255.0 255.0 255.0 255.0 128.0 128.0 128.0 128.0 191.0 255.0 255.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 255.0 255.0 255.0 128.0 64.0 0.0 0.0 0.0 0.0 0.0 255.0 255.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 255.0 255.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 255.0 255.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 255.0 255.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 255.0 255.0 255.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 255.0 255.0 0.0 0.0 0.0 0.0 64.0 128.0 255.0 255.0 191.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 191.0 255.0 255.0 128.0 128.0 128.0 255.0 255.0 255.0 255.0 191.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 255.0 255.0 255.0 255.0 255.0 255.0 255.0 64.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 255.0 255.0 255.0 255.0 128.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 68.0 45.0 131.0 131.0 131.0 101.0 68.0 92.0 44.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 19.0 170.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 29.0 112.0 89.0 0.0 40.0 222.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 120.0 254.0 251.0 127.0 40.0 222.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 197.0 254.0 254.0 91.0 40.0 222.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 247.0 254.0 236.0 50.0 40.0 107.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 184.0 254.0 254.0 91.0 0.0 6.0 14.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 203.0 254.0 254.0 71.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 23.0 218.0 254.0 254.0 71.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 113.0 254.0 255.0 239.0 53.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 210.0 254.0 254.0 195.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 62.0 242.0 254.0 241.0 88.0 0.0 0.0 0.0 28.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 86.0 254.0 254.0 189.0 0.0 0.0 0.0 28.0 104.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 106.0 254.0 254.0 168.0 0.0 0.0 0.0 40.0 91.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 216.0 254.0 245.0 51.0 0.0 0.0 0.0 35.0 80.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 216.0 254.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 55.0 239.0 254.0 52.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 166.0 254.0 210.0 23.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 223.0 252.0 104.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 223.0 169.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 29.0 170.0 255.0 255.0 141.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 29.0 198.0 255.0 255.0 255.0 226.0 255.0 86.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 141.0 255.0 255.0 170.0 29.0 0.0 86.0 255.0 255.0 141.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 29.0 226.0 255.0 198.0 57.0 0.0 0.0 0.0 0.0 226.0 255.0 255.0 226.0 114.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 29.0 255.0 255.0 114.0 0.0 0.0 0.0 0.0 0.0 0.0 141.0 170.0 114.0 255.0 255.0 141.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 226.0 255.0 170.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 29.0 57.0 0.0 0.0 141.0 255.0 226.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 57.0 255.0 170.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 114.0 255.0 198.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 226.0 255.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 170.0 255.0 57.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 226.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 170.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 170.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 114.0 198.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 226.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 86.0 255.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 198.0 255.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 86.0 255.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 114.0 255.0 57.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 86.0 255.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 29.0 255.0 226.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 141.0 255.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 170.0 255.0 170.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 226.0 198.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 29.0 226.0 255.0 170.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 29.0 255.0 114.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 29.0 226.0 255.0 141.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 57.0 226.0 226.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 141.0 255.0 255.0 170.0 86.0 0.0 0.0 0.0 0.0 29.0 86.0 226.0 255.0 226.0 29.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 86.0 198.0 255.0 255.0 255.0 255.0 255.0 255.0 255.0 255.0 255.0 141.0 29.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 29.0 114.0 170.0 170.0 170.0 170.0 170.0 86.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 203.0 254.0 252.0 252.0 252.0 214.0 51.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 62.0 221.0 252.0 250.0 250.0 250.0 252.0 250.0 160.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 62.0 211.0 250.0 252.0 250.0 250.0 250.0 252.0 250.0 250.0 49.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 41.0 221.0 250.0 250.0 252.0 250.0 250.0 250.0 252.0 250.0 128.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 252.0 252.0 252.0 254.0 252.0 252.0 252.0 254.0 252.0 252.0 90.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 150.0 190.0 250.0 250.0 252.0 250.0 250.0 169.0 171.0 250.0 250.0 250.0 82.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 31.0 191.0 250.0 250.0 252.0 189.0 100.0 20.0 172.0 250.0 250.0 250.0 80.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 213.0 250.0 250.0 250.0 212.0 29.0 0.0 0.0 252.0 250.0 250.0 250.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 92.0 252.0 252.0 252.0 0.0 0.0 0.0 0.0 51.0 252.0 252.0 252.0 203.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 82.0 252.0 250.0 250.0 169.0 0.0 0.0 0.0 0.0 132.0 250.0 250.0 250.0 121.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 92.0 231.0 252.0 250.0 159.0 20.0 0.0 0.0 0.0 0.0 252.0 250.0 250.0 250.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 30.0 211.0 252.0 250.0 221.0 40.0 0.0 0.0 0.0 0.0 90.0 250.0 250.0 250.0 163.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 31.0 213.0 254.0 232.0 80.0 0.0 0.0 0.0 0.0 0.0 92.0 252.0 252.0 212.0 163.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 151.0 250.0 252.0 149.0 0.0 0.0 0.0 0.0 0.0 0.0 252.0 250.0 250.0 49.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 60.0 221.0 252.0 210.0 60.0 0.0 0.0 0.0 0.0 0.0 252.0 250.0 250.0 49.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 202.0 252.0 250.0 221.0 40.0 0.0 0.0 123.0 202.0 252.0 250.0 250.0 49.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 123.0 243.0 255.0 252.0 252.0 252.0 254.0 252.0 252.0 252.0 254.0 252.0 100.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 121.0 171.0 250.0 250.0 250.0 252.0 250.0 250.0 250.0 252.0 250.0 100.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 20.0 160.0 250.0 250.0 252.0 250.0 250.0 250.0 252.0 189.0 40.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 20.0 170.0 250.0 252.0 250.0 128.0 49.0 49.0 29.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 191.0 70.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 68.0 243.0 253.0 249.0 63.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 30.0 223.0 253.0 253.0 247.0 41.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 73.0 238.0 253.0 253.0 253.0 242.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 73.0 236.0 253.0 253.0 253.0 253.0 242.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 182.0 253.0 253.0 191.0 247.0 253.0 149.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 141.0 253.0 143.0 86.0 249.0 253.0 122.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 9.0 36.0 7.0 14.0 233.0 253.0 122.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 230.0 253.0 122.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 230.0 253.0 122.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 231.0 255.0 123.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 230.0 253.0 52.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 61.0 245.0 253.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 98.0 253.0 253.0 0.0 0.0 0.0 0.0 35.0 12.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 98.0 253.0 253.0 0.0 0.0 9.0 142.0 233.0 146.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 190.0 253.0 253.0 128.0 7.0 99.0 253.0 253.0 180.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 29.0 230.0 253.0 253.0 252.0 210.0 253.0 253.0 253.0 140.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 28.0 207.0 253.0 253.0 253.0 254.0 253.0 253.0 235.0 70.0 9.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 126.0 253.0 253.0 253.0 253.0 254.0 253.0 168.0 19.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 79.0 253.0 253.0 201.0 190.0 132.0 63.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 19.0 133.0 133.0 156.0 254.0 254.0 214.0 83.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 10.0 134.0 197.0 254.0 253.0 253.0 253.0 253.0 253.0 253.0 156.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 28.0 78.0 194.0 253.0 253.0 254.0 250.0 217.0 217.0 226.0 253.0 253.0 156.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 10.0 135.0 234.0 253.0 253.0 253.0 253.0 246.0 76.0 0.0 10.0 98.0 253.0 253.0 133.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 9.0 155.0 253.0 253.0 253.0 224.0 198.0 134.0 69.0 0.0 0.0 78.0 253.0 253.0 192.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 9.0 140.0 180.0 88.0 60.0 32.0 6.0 0.0 0.0 0.0 63.0 234.0 253.0 163.0 40.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 9.0 189.0 253.0 163.0 12.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 221.0 253.0 211.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 65.0 253.0 238.0 59.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 59.0 249.0 242.0 56.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 249.0 249.0 52.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 10.0 232.0 253.0 161.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 53.0 194.0 253.0 178.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 166.0 253.0 232.0 49.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 82.0 240.0 230.0 52.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 18.0 211.0 229.0 54.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 17.0 126.0 253.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 49.0 253.0 144.0 7.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 16.0 195.0 227.0 34.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 152.0 230.0 43.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 26.0 240.0 72.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 25.0 238.0 208.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 209.0 226.0 14.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 209.0 254.0 43.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 175.0 254.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 63.0 254.0 204.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 107.0 254.0 204.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 88.0 254.0 204.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 55.0 254.0 204.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 126.0 254.0 204.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 126.0 254.0 189.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 169.0 254.0 121.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 209.0 254.0 193.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 209.0 254.0 111.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 22.0 235.0 254.0 37.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 137.0 254.0 227.0 16.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 205.0 255.0 185.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 205.0 254.0 125.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 205.0 254.0 125.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 111.0 212.0 43.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 134.0 255.0 113.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 86.0 214.0 253.0 112.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 138.0 253.0 163.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 19.0 198.0 253.0 49.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 186.0 253.0 208.0 19.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 54.0 229.0 243.0 92.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 33.0 228.0 253.0 164.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 135.0 253.0 186.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 59.0 230.0 253.0 68.0 0.0 0.0 0.0 20.0 56.0 35.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 10.0 188.0 253.0 182.0 18.0 17.0 63.0 162.0 209.0 253.0 227.0 48.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 71.0 253.0 215.0 18.0 17.0 179.0 253.0 253.0 253.0 253.0 253.0 148.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 25.0 233.0 253.0 107.0 0.0 159.0 253.0 253.0 193.0 136.0 101.0 244.0 148.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 71.0 253.0 178.0 16.0 85.0 240.0 231.0 136.0 10.0 0.0 76.0 248.0 148.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 9.0 189.0 253.0 86.0 42.0 241.0 253.0 185.0 0.0 0.0 0.0 94.0 219.0 37.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 71.0 253.0 240.0 71.0 185.0 253.0 154.0 27.0 0.0 0.0 33.0 213.0 109.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 149.0 253.0 216.0 93.0 253.0 231.0 41.0 0.0 0.0 81.0 213.0 253.0 91.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 149.0 253.0 216.0 117.0 253.0 221.0 106.0 106.0 142.0 249.0 253.0 214.0 18.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 34.0 253.0 251.0 157.0 214.0 253.0 253.0 253.0 253.0 253.0 118.0 12.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 159.0 253.0 253.0 253.0 253.0 253.0 253.0 219.0 35.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 34.0 253.0 253.0 253.0 253.0 223.0 96.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 87.0 159.0 253.0 159.0 243.0 191.0 61.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 74.0 253.0 252.0 252.0 252.0 252.0 253.0 236.0 65.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 26.0 205.0 253.0 252.0 252.0 252.0 252.0 253.0 252.0 202.0 13.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 59.0 160.0 203.0 160.0 160.0 160.0 108.0 253.0 252.0 252.0 45.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 0.0 0.0 0.0 53.0 253.0 252.0 252.0 45.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 231.0 255.0 253.0 173.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 9.0 47.0 140.0 244.0 253.0 252.0 102.0 9.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 130.0 252.0 252.0 252.0 253.0 252.0 252.0 77.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 62.0 236.0 252.0 252.0 64.0 211.0 252.0 252.0 194.0 9.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 76.0 211.0 221.0 43.0 2.0 86.0 252.0 252.0 252.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 100.0 253.0 253.0 148.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 47.0 252.0 252.0 252.0 74.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 34.0 234.0 252.0 252.0 199.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 90.0 252.0 252.0 178.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 122.0 252.0 252.0 126.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 87.0 154.0 0.0 0.0 0.0 0.0 36.0 222.0 253.0 243.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 138.0 236.0 78.0 9.0 22.0 57.0 219.0 252.0 235.0 60.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 138.0 252.0 252.0 196.0 215.0 253.0 252.0 252.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 97.0 252.0 252.0 252.0 252.0 253.0 252.0 101.0 9.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 13.0 211.0 252.0 252.0 200.0 137.0 64.0 6.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 62.0 91.0 213.0 255.0 228.0 91.0 12.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 70.0 230.0 253.0 253.0 253.0 253.0 253.0 152.0 7.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 246.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 106.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 247.0 253.0 253.0 253.0 253.0 253.0 253.0 208.0 24.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 156.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 195.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 88.0 238.0 253.0 253.0 253.0 221.0 253.0 253.0 253.0 195.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 230.0 253.0 253.0 253.0 198.0 40.0 177.0 253.0 253.0 195.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 56.0 156.0 251.0 253.0 189.0 182.0 15.0 0.0 86.0 240.0 253.0 210.0 28.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 213.0 253.0 253.0 156.0 3.0 0.0 0.0 0.0 0.0 205.0 253.0 253.0 106.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 121.0 252.0 253.0 135.0 3.0 0.0 0.0 0.0 0.0 0.0 46.0 253.0 253.0 106.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 28.0 212.0 253.0 248.0 23.0 0.0 0.0 0.0 0.0 0.0 0.0 42.0 253.0 253.0 106.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 197.0 253.0 234.0 70.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 42.0 253.0 253.0 106.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 202.0 253.0 187.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 58.0 253.0 210.0 27.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 107.0 253.0 253.0 40.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 53.0 227.0 253.0 195.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 107.0 253.0 253.0 40.0 0.0 0.0 0.0 0.0 0.0 0.0 47.0 227.0 253.0 231.0 58.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 107.0 253.0 253.0 40.0 0.0 0.0 0.0 0.0 5.0 131.0 222.0 253.0 231.0 59.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 14.0 204.0 253.0 226.0 222.0 73.0 58.0 58.0 170.0 253.0 253.0 227.0 58.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 197.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 238.0 58.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 33.0 179.0 241.0 253.0 253.0 253.0 253.0 250.0 116.0 14.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 75.0 179.0 253.0 151.0 89.0 86.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 34.0 80.0 80.0 80.0 58.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 138.0 159.0 159.0 199.0 254.0 254.0 254.0 228.0 66.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 39.0 62.0 160.0 252.0 254.0 254.0 254.0 254.0 233.0 233.0 254.0 245.0 67.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 45.0 212.0 254.0 254.0 254.0 186.0 114.0 114.0 114.0 74.0 75.0 251.0 254.0 201.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 233.0 254.0 244.0 210.0 58.0 18.0 0.0 0.0 0.0 0.0 30.0 249.0 254.0 201.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 131.0 131.0 100.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 168.0 254.0 254.0 201.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 71.0 237.0 254.0 254.0 61.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 157.0 254.0 254.0 192.0 15.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 140.0 254.0 254.0 203.0 29.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 107.0 254.0 254.0 254.0 123.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 18.0 204.0 254.0 196.0 87.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 35.0 212.0 254.0 252.0 121.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 124.0 254.0 192.0 101.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 77.0 242.0 249.0 118.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 221.0 254.0 228.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 196.0 254.0 250.0 124.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 45.0 254.0 254.0 196.0 116.0 76.0 0.0 112.0 48.0 0.0 0.0 16.0 116.0 116.0 116.0 116.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 154.0 254.0 254.0 254.0 234.0 194.0 253.0 219.0 194.0 194.0 203.0 254.0 241.0 237.0 237.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 77.0 157.0 198.0 254.0 254.0 254.0 254.0 254.0 254.0 254.0 173.0 157.0 38.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 33.0 78.0 78.0 78.0 78.0 78.0 78.0 78.0 13.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 42.0 228.0 253.0 253.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 144.0 251.0 251.0 251.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 89.0 236.0 251.0 235.0 215.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 79.0 253.0 251.0 251.0 142.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 180.0 253.0 251.0 251.0 142.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 32.0 202.0 255.0 253.0 216.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 109.0 251.0 253.0 251.0 112.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 129.0 251.0 253.0 127.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 37.0 251.0 251.0 253.0 107.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 166.0 251.0 251.0 201.0 30.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 42.0 228.0 253.0 253.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 144.0 251.0 251.0 147.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 63.0 236.0 251.0 251.0 71.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 150.0 251.0 251.0 204.0 41.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 253.0 251.0 251.0 142.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 253.0 164.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 105.0 253.0 251.0 35.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 180.0 253.0 251.0 35.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 180.0 253.0 251.0 35.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 180.0 253.0 251.0 35.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 62.0 254.0 213.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 102.0 253.0 252.0 102.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 102.0 254.0 253.0 254.0 50.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 102.0 253.0 252.0 253.0 50.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 102.0 254.0 253.0 254.0 50.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 142.0 253.0 252.0 253.0 50.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 51.0 253.0 254.0 253.0 224.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 132.0 252.0 253.0 252.0 162.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 173.0 253.0 254.0 253.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 82.0 253.0 252.0 253.0 252.0 61.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 203.0 254.0 253.0 254.0 233.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 41.0 243.0 253.0 252.0 253.0 111.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 132.0 253.0 254.0 253.0 203.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 41.0 253.0 252.0 253.0 252.0 40.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 213.0 254.0 253.0 254.0 151.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 92.0 252.0 253.0 252.0 192.0 50.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 214.0 253.0 255.0 253.0 41.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 142.0 253.0 252.0 253.0 171.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 113.0 253.0 255.0 253.0 203.0 40.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 30.0 131.0 233.0 111.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 32.0 129.0 253.0 192.0 15.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 94.0 217.0 218.0 227.0 252.0 252.0 253.0 159.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 37.0 182.0 201.0 252.0 252.0 253.0 252.0 252.0 252.0 253.0 76.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 120.0 252.0 253.0 252.0 252.0 252.0 253.0 252.0 252.0 252.0 253.0 35.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 63.0 109.0 232.0 252.0 252.0 253.0 252.0 174.0 143.0 47.0 232.0 252.0 252.0 144.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 73.0 237.0 252.0 252.0 252.0 210.0 180.0 138.0 10.0 0.0 233.0 252.0 252.0 210.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 72.0 236.0 215.0 91.0 71.0 31.0 0.0 0.0 0.0 21.0 253.0 252.0 246.0 92.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 62.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 206.0 253.0 210.0 92.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 182.0 253.0 208.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 105.0 242.0 252.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 79.0 242.0 252.0 231.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 191.0 252.0 231.0 46.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 16.0 191.0 255.0 222.0 41.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 78.0 252.0 253.0 138.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 156.0 232.0 252.0 175.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 63.0 237.0 252.0 252.0 62.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 253.0 253.0 217.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 125.0 252.0 231.0 71.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 27.0 221.0 252.0 76.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 37.0 252.0 189.0 15.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 15.0 138.0 201.0 253.0 255.0 232.0 107.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 15.0 219.0 252.0 252.0 210.0 207.0 214.0 252.0 119.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 138.0 252.0 233.0 89.0 6.0 0.0 13.0 202.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 43.0 253.0 252.0 183.0 0.0 0.0 0.0 0.0 159.0 29.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 116.0 253.0 252.0 79.0 0.0 0.0 0.0 0.0 63.0 43.0 220.0 106.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 116.0 255.0 232.0 38.0 0.0 0.0 0.0 0.0 7.0 212.0 253.0 231.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 42.0 253.0 252.0 154.0 30.0 0.0 0.0 9.0 155.0 252.0 252.0 230.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 222.0 252.0 252.0 227.0 184.0 132.0 197.0 252.0 252.0 252.0 199.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 25.0 119.0 160.0 236.0 252.0 253.0 252.0 227.0 160.0 244.0 116.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 158.0 0.0 0.0 61.0 85.0 75.0 22.0 16.0 0.0 178.0 220.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 9.0 128.0 11.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 231.0 231.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 93.0 252.0 116.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 157.0 230.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 93.0 252.0 116.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 116.0 237.0 25.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 134.0 252.0 63.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 116.0 234.0 17.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 103.0 252.0 116.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 220.0 241.0 42.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 93.0 253.0 244.0 61.0 0.0 0.0 0.0 0.0 0.0 38.0 233.0 253.0 221.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 34.0 217.0 253.0 236.0 129.0 9.0 0.0 0.0 30.0 155.0 252.0 231.0 42.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 84.0 253.0 252.0 252.0 196.0 80.0 185.0 228.0 252.0 227.0 131.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 56.0 219.0 252.0 252.0 252.0 253.0 252.0 252.0 119.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 15.0 54.0 179.0 147.0 190.0 117.0 22.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 28.0 195.0 254.0 254.0 254.0 254.0 254.0 255.0 61.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 191.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 60.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 26.0 190.0 253.0 253.0 253.0 253.0 240.0 191.0 242.0 253.0 60.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 15.0 187.0 253.0 253.0 253.0 253.0 253.0 200.0 0.0 211.0 253.0 60.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 22.0 66.0 253.0 253.0 253.0 253.0 241.0 209.0 44.0 23.0 218.0 253.0 60.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 124.0 253.0 253.0 253.0 253.0 253.0 182.0 0.0 0.0 131.0 253.0 253.0 60.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 38.0 217.0 253.0 253.0 244.0 111.0 37.0 0.0 0.0 131.0 253.0 253.0 60.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 124.0 253.0 253.0 253.0 165.0 0.0 0.0 0.0 22.0 182.0 253.0 253.0 60.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 124.0 253.0 253.0 240.0 45.0 0.0 0.0 0.0 53.0 253.0 253.0 249.0 58.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 16.0 168.0 253.0 216.0 45.0 0.0 0.0 0.0 0.0 53.0 253.0 253.0 138.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 159.0 253.0 253.0 147.0 0.0 0.0 0.0 0.0 0.0 53.0 253.0 253.0 138.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 136.0 252.0 253.0 227.0 5.0 0.0 0.0 0.0 0.0 0.0 53.0 253.0 243.0 101.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 140.0 253.0 253.0 124.0 0.0 0.0 0.0 0.0 0.0 0.0 156.0 253.0 218.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 13.0 164.0 253.0 142.0 5.0 0.0 0.0 0.0 0.0 0.0 32.0 233.0 253.0 218.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 62.0 253.0 253.0 130.0 0.0 0.0 0.0 0.0 0.0 37.0 203.0 253.0 253.0 127.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 62.0 253.0 253.0 147.0 36.0 36.0 36.0 36.0 151.0 222.0 253.0 245.0 127.0 8.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 34.0 202.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 200.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 140.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 248.0 235.0 65.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 87.0 173.0 253.0 253.0 253.0 253.0 253.0 253.0 182.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 14.0 78.0 96.0 253.0 253.0 253.0 137.0 56.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 8.0 78.0 156.0 209.0 165.0 43.0 11.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 116.0 157.0 252.0 252.0 252.0 252.0 253.0 205.0 51.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 211.0 253.0 252.0 252.0 252.0 252.0 253.0 252.0 225.0 7.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 211.0 253.0 252.0 252.0 252.0 252.0 227.0 252.0 252.0 196.0 28.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 211.0 253.0 252.0 252.0 226.0 59.0 42.0 182.0 252.0 252.0 129.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 212.0 254.0 222.0 106.0 0.0 0.0 0.0 36.0 224.0 253.0 253.0 62.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 53.0 63.0 16.0 0.0 0.0 0.0 0.0 0.0 48.0 252.0 252.0 141.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 210.0 252.0 215.0 6.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 99.0 252.0 253.0 63.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 218.0 253.0 63.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 212.0 255.0 63.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 15.0 85.0 85.0 85.0 85.0 85.0 57.0 0.0 0.0 211.0 253.0 107.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 92.0 127.0 192.0 252.0 252.0 252.0 252.0 253.0 246.0 232.0 232.0 249.0 253.0 63.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 92.0 252.0 252.0 253.0 252.0 252.0 252.0 252.0 253.0 252.0 252.0 252.0 252.0 253.0 133.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 215.0 252.0 252.0 253.0 252.0 252.0 252.0 252.0 253.0 252.0 252.0 252.0 252.0 253.0 203.0 9.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 85.0 253.0 253.0 253.0 194.0 106.0 53.0 0.0 0.0 62.0 120.0 156.0 253.0 253.0 255.0 253.0 188.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 85.0 252.0 252.0 252.0 129.0 57.0 71.0 0.0 71.0 146.0 211.0 252.0 252.0 252.0 160.0 231.0 231.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 85.0 252.0 252.0 252.0 253.0 246.0 249.0 232.0 249.0 253.0 252.0 252.0 252.0 244.0 53.0 51.0 72.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 247.0 252.0 252.0 253.0 252.0 252.0 252.0 252.0 253.0 252.0 252.0 236.0 66.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 56.0 252.0 252.0 253.0 252.0 252.0 252.0 252.0 253.0 252.0 235.0 31.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 255.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 255.0 255.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 255.0 255.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 191.0 255.0 64.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 255.0 191.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 191.0 255.0 191.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 255.0 255.0 64.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 255.0 255.0 64.0 0.0 0.0 0.0 64.0 128.0 128.0 64.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 191.0 255.0 191.0 0.0 0.0 0.0 128.0 255.0 255.0 255.0 255.0 255.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 255.0 64.0 0.0 0.0 128.0 255.0 255.0 255.0 128.0 255.0 255.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 255.0 128.0 0.0 0.0 128.0 255.0 255.0 191.0 0.0 0.0 128.0 255.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 255.0 255.0 64.0 0.0 0.0 191.0 255.0 191.0 0.0 0.0 0.0 64.0 255.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 255.0 191.0 0.0 0.0 64.0 255.0 255.0 0.0 0.0 0.0 0.0 64.0 255.0 64.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 255.0 64.0 0.0 0.0 128.0 255.0 191.0 0.0 0.0 0.0 0.0 191.0 255.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 255.0 255.0 0.0 0.0 0.0 128.0 255.0 64.0 0.0 0.0 64.0 255.0 255.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 255.0 255.0 0.0 0.0 0.0 0.0 255.0 255.0 128.0 191.0 255.0 255.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 255.0 255.0 128.0 128.0 128.0 128.0 255.0 255.0 255.0 255.0 255.0 64.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 255.0 255.0 255.0 255.0 255.0 255.0 191.0 128.0 64.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 255.0 255.0 255.0 255.0 255.0 191.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 214.0 253.0 152.0 152.0 152.0 152.0 152.0 152.0 152.0 152.0 254.0 253.0 254.0 172.0 152.0 71.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 61.0 213.0 252.0 253.0 252.0 253.0 252.0 253.0 252.0 253.0 252.0 213.0 252.0 253.0 252.0 253.0 252.0 82.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 41.0 102.0 102.0 102.0 102.0 82.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 52.0 253.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 132.0 252.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 253.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 41.0 253.0 252.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 163.0 254.0 131.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 41.0 243.0 253.0 50.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 113.0 253.0 224.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 41.0 233.0 252.0 81.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 123.0 254.0 233.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 223.0 253.0 111.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 152.0 253.0 224.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 233.0 252.0 162.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 102.0 254.0 253.0 41.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 183.0 253.0 171.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 213.0 254.0 131.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 51.0 252.0 233.0 30.0 41.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 51.0 253.0 254.0 213.0 183.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 31.0 232.0 253.0 212.0 20.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 77.0 211.0 254.0 254.0 255.0 254.0 133.0 8.0 0.0 36.0 98.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 157.0 253.0 253.0 243.0 173.0 100.0 250.0 123.0 7.0 147.0 186.0 14.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 253.0 225.0 82.0 57.0 0.0 0.0 249.0 244.0 187.0 240.0 42.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 183.0 236.0 54.0 0.0 0.0 0.0 0.0 249.0 253.0 253.0 188.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 243.0 238.0 33.0 0.0 0.0 34.0 197.0 252.0 253.0 253.0 147.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 193.0 253.0 199.0 0.0 0.0 200.0 253.0 253.0 253.0 211.0 8.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 251.0 252.0 160.0 215.0 252.0 253.0 245.0 61.0 9.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 131.0 253.0 253.0 253.0 253.0 243.0 57.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 44.0 253.0 253.0 253.0 218.0 63.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 30.0 168.0 244.0 236.0 253.0 124.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 215.0 199.0 49.0 87.0 253.0 187.0 7.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 34.0 144.0 205.0 70.0 0.0 10.0 204.0 253.0 67.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 89.0 253.0 129.0 0.0 0.0 0.0 88.0 253.0 141.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 43.0 229.0 248.0 13.0 0.0 0.0 0.0 78.0 253.0 141.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 189.0 253.0 133.0 0.0 0.0 0.0 0.0 91.0 242.0 125.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 10.0 201.0 195.0 10.0 0.0 0.0 0.0 0.0 195.0 158.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 84.0 253.0 134.0 0.0 0.0 0.0 11.0 148.0 237.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 12.0 198.0 253.0 86.0 0.0 41.0 84.0 111.0 253.0 153.0 9.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 22.0 221.0 253.0 241.0 219.0 236.0 253.0 237.0 126.0 8.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 37.0 223.0 253.0 253.0 195.0 69.0 14.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 7.0 7.0 77.0 142.0 254.0 254.0 254.0 254.0 254.0 163.0 98.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 253.0 253.0 252.0 241.0 241.0 243.0 253.0 253.0 253.0 253.0 219.0 33.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 236.0 229.0 111.0 100.0 0.0 0.0 19.0 111.0 111.0 141.0 249.0 253.0 172.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 56.0 228.0 253.0 160.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 7.0 141.0 253.0 253.0 208.0 19.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 129.0 253.0 253.0 253.0 226.0 161.0 46.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 144.0 231.0 210.0 243.0 253.0 253.0 224.0 123.0 6.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 40.0 0.0 61.0 117.0 219.0 253.0 253.0 183.0 17.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 24.0 117.0 245.0 253.0 135.0 32.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 104.0 246.0 253.0 169.0 34.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 54.0 235.0 253.0 167.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 102.0 248.0 253.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 196.0 253.0 106.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 112.0 253.0 129.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 112.0 253.0 175.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 112.0 253.0 144.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 78.0 26.0 0.0 0.0 0.0 0.0 0.0 0.0 163.0 253.0 78.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 28.0 219.0 206.0 112.0 112.0 112.0 112.0 112.0 224.0 252.0 253.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 9.0 195.0 253.0 253.0 253.0 253.0 253.0 253.0 201.0 78.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 5.0 5.0 5.0 51.0 129.0 17.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 39.0 125.0 225.0 254.0 254.0 255.0 254.0 170.0 48.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 43.0 101.0 250.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 250.0 161.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 94.0 246.0 247.0 253.0 253.0 196.0 227.0 116.0 56.0 253.0 253.0 253.0 234.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 152.0 253.0 253.0 180.0 19.0 9.0 15.0 0.0 4.0 55.0 253.0 253.0 166.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 41.0 238.0 253.0 253.0 125.0 0.0 0.0 0.0 21.0 189.0 232.0 253.0 253.0 117.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 219.0 253.0 220.0 165.0 34.0 92.0 21.0 52.0 228.0 253.0 253.0 241.0 82.0 13.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 38.0 241.0 170.0 25.0 20.0 12.0 75.0 39.0 59.0 253.0 253.0 253.0 110.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 112.0 253.0 236.0 67.0 0.0 0.0 0.0 0.0 100.0 253.0 253.0 221.0 16.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 23.0 239.0 253.0 235.0 202.0 135.0 99.0 173.0 240.0 253.0 253.0 110.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 54.0 200.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 241.0 63.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 25.0 112.0 244.0 253.0 237.0 142.0 253.0 253.0 111.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 61.0 71.0 51.0 159.0 253.0 188.0 22.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 15.0 150.0 236.0 212.0 22.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 99.0 253.0 243.0 98.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 72.0 237.0 253.0 105.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 10.0 219.0 253.0 195.0 22.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 8.0 171.0 253.0 207.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 105.0 253.0 198.0 76.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 60.0 242.0 253.0 38.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 235.0 253.0 206.0 19.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 8.0 76.0 202.0 254.0 255.0 163.0 37.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 13.0 182.0 253.0 253.0 253.0 253.0 253.0 253.0 23.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 15.0 179.0 253.0 253.0 212.0 91.0 218.0 253.0 253.0 179.0 109.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 105.0 253.0 253.0 160.0 35.0 156.0 253.0 253.0 253.0 253.0 250.0 113.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 19.0 212.0 253.0 253.0 88.0 121.0 253.0 233.0 128.0 91.0 245.0 253.0 248.0 114.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 104.0 253.0 253.0 110.0 2.0 142.0 253.0 90.0 0.0 0.0 26.0 199.0 253.0 248.0 63.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 173.0 253.0 253.0 29.0 0.0 84.0 228.0 39.0 0.0 0.0 0.0 72.0 251.0 253.0 215.0 29.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 36.0 253.0 253.0 203.0 13.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 82.0 253.0 253.0 170.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 36.0 253.0 253.0 164.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 198.0 253.0 184.0 6.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 36.0 253.0 253.0 82.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 138.0 253.0 253.0 35.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 253.0 253.0 47.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 48.0 253.0 253.0 35.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 154.0 253.0 253.0 47.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 48.0 253.0 253.0 35.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 102.0 253.0 253.0 99.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 48.0 253.0 253.0 35.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 36.0 253.0 253.0 164.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 16.0 208.0 253.0 211.0 17.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 32.0 244.0 253.0 175.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 44.0 253.0 253.0 156.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 171.0 253.0 253.0 29.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 30.0 217.0 253.0 188.0 19.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 171.0 253.0 253.0 59.0 0.0 0.0 0.0 0.0 0.0 0.0 60.0 217.0 253.0 253.0 70.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 78.0 253.0 253.0 231.0 48.0 0.0 0.0 0.0 26.0 128.0 249.0 253.0 244.0 94.0 15.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 8.0 151.0 253.0 253.0 234.0 101.0 121.0 219.0 229.0 253.0 253.0 201.0 80.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 38.0 232.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 201.0 66.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 232.0 253.0 253.0 95.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 86.0 46.0 0.0 0.0 0.0 0.0 0.0 0.0 91.0 246.0 252.0 232.0 57.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 103.0 252.0 187.0 13.0 0.0 0.0 0.0 0.0 22.0 219.0 252.0 252.0 175.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 10.0 0.0 0.0 0.0 0.0 8.0 181.0 252.0 246.0 30.0 0.0 0.0 0.0 0.0 65.0 252.0 237.0 197.0 64.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 87.0 0.0 0.0 0.0 13.0 172.0 252.0 252.0 104.0 0.0 0.0 0.0 0.0 5.0 184.0 252.0 67.0 103.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 8.0 172.0 252.0 248.0 145.0 14.0 0.0 0.0 0.0 0.0 109.0 252.0 183.0 137.0 64.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 224.0 252.0 248.0 134.0 0.0 0.0 0.0 0.0 0.0 53.0 238.0 252.0 245.0 86.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 12.0 174.0 252.0 223.0 88.0 0.0 0.0 0.0 0.0 0.0 0.0 209.0 252.0 252.0 179.0 9.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 171.0 252.0 246.0 61.0 0.0 0.0 0.0 0.0 0.0 0.0 83.0 241.0 252.0 211.0 14.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 129.0 252.0 252.0 249.0 220.0 220.0 215.0 111.0 192.0 220.0 221.0 243.0 252.0 252.0 149.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 144.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 255.0 253.0 226.0 153.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 44.0 77.0 77.0 77.0 77.0 77.0 77.0 77.0 77.0 153.0 253.0 235.0 32.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 74.0 214.0 240.0 114.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 24.0 221.0 243.0 57.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 8.0 180.0 252.0 119.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 136.0 252.0 153.0 7.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 136.0 251.0 226.0 34.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 123.0 252.0 246.0 39.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 165.0 252.0 127.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 165.0 175.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 25.0 214.0 225.0 90.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 7.0 145.0 212.0 253.0 253.0 60.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 106.0 253.0 253.0 246.0 188.0 23.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 45.0 164.0 254.0 253.0 223.0 108.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 24.0 236.0 253.0 252.0 124.0 28.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 100.0 217.0 253.0 218.0 116.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 158.0 175.0 225.0 253.0 92.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 24.0 217.0 241.0 248.0 114.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 201.0 253.0 253.0 114.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 107.0 253.0 253.0 213.0 19.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 170.0 254.0 254.0 169.0 0.0 0.0 0.0 0.0 0.0 2.0 13.0 100.0 133.0 89.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 18.0 210.0 253.0 253.0 100.0 0.0 0.0 0.0 19.0 76.0 116.0 253.0 253.0 253.0 176.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 41.0 222.0 253.0 208.0 18.0 0.0 0.0 93.0 209.0 232.0 217.0 224.0 253.0 253.0 241.0 31.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 157.0 253.0 253.0 229.0 32.0 0.0 154.0 250.0 246.0 36.0 0.0 49.0 253.0 253.0 168.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 253.0 253.0 253.0 195.0 125.0 247.0 166.0 69.0 0.0 0.0 37.0 236.0 253.0 168.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 37.0 253.0 253.0 253.0 253.0 253.0 135.0 32.0 0.0 7.0 130.0 73.0 202.0 253.0 133.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 7.0 185.0 253.0 253.0 253.0 253.0 64.0 0.0 10.0 210.0 253.0 253.0 253.0 153.0 9.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 66.0 253.0 253.0 253.0 253.0 238.0 218.0 221.0 253.0 253.0 235.0 156.0 37.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 111.0 228.0 253.0 253.0 253.0 253.0 254.0 253.0 168.0 19.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 9.0 110.0 178.0 253.0 253.0 249.0 63.0 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 121.0 121.0 240.0 253.0 218.0 121.0 121.0 44.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 17.0 107.0 184.0 240.0 253.0 252.0 252.0 252.0 252.0 252.0 252.0 219.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 75.0 122.0 230.0 252.0 252.0 252.0 253.0 252.0 252.0 252.0 252.0 252.0 252.0 239.0 56.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 77.0 129.0 213.0 244.0 252.0 252.0 252.0 252.0 252.0 253.0 252.0 252.0 209.0 252.0 252.0 252.0 225.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 240.0 252.0 252.0 252.0 252.0 252.0 252.0 213.0 185.0 53.0 53.0 53.0 89.0 252.0 252.0 252.0 120.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 240.0 232.0 198.0 93.0 164.0 108.0 66.0 28.0 0.0 0.0 0.0 0.0 81.0 252.0 252.0 222.0 24.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 76.0 50.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 171.0 252.0 243.0 108.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 144.0 238.0 252.0 115.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 7.0 70.0 241.0 248.0 133.0 28.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 121.0 252.0 252.0 172.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 255.0 253.0 209.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 13.0 246.0 253.0 207.0 21.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 10.0 172.0 252.0 209.0 92.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 13.0 168.0 252.0 252.0 92.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 43.0 208.0 252.0 241.0 53.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 15.0 166.0 252.0 204.0 62.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 13.0 166.0 243.0 191.0 29.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 10.0 168.0 231.0 177.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 172.0 241.0 50.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 177.0 202.0 19.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 196.0 99.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 49.0 0.0 0.0 0.0 0.0 0.0 0.0 34.0 244.0 98.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 89.0 135.0 0.0 0.0 0.0 0.0 0.0 0.0 40.0 253.0 98.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 171.0 150.0 0.0 0.0 0.0 0.0 0.0 0.0 40.0 253.0 98.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 233.0 0.0 0.0 0.0 0.0 0.0 0.0 77.0 253.0 98.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 255.0 136.0 0.0 0.0 0.0 0.0 0.0 0.0 77.0 254.0 99.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 135.0 0.0 0.0 0.0 0.0 0.0 0.0 123.0 253.0 98.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 254.0 135.0 0.0 0.0 0.0 0.0 0.0 0.0 136.0 253.0 98.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 16.0 254.0 135.0 0.0 0.0 0.0 0.0 0.0 0.0 136.0 237.0 8.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 98.0 254.0 135.0 0.0 0.0 38.0 99.0 98.0 98.0 219.0 155.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 196.0 255.0 208.0 186.0 254.0 254.0 255.0 254.0 254.0 254.0 254.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 105.0 254.0 253.0 239.0 180.0 135.0 39.0 39.0 39.0 237.0 170.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 137.0 92.0 24.0 0.0 0.0 0.0 0.0 0.0 234.0 155.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 13.0 237.0 155.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 79.0 253.0 155.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 31.0 242.0 155.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 61.0 248.0 155.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 234.0 155.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 234.0 155.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 196.0 155.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 50.0 236.0 255.0 124.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 53.0 231.0 253.0 253.0 107.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 9.0 193.0 253.0 253.0 230.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 7.0 156.0 253.0 253.0 149.0 36.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 24.0 253.0 253.0 190.0 8.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 175.0 253.0 253.0 72.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 123.0 253.0 253.0 138.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 10.0 244.0 253.0 230.0 34.0 0.0 9.0 24.0 23.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 181.0 253.0 249.0 123.0 0.0 69.0 195.0 253.0 249.0 146.0 15.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 21.0 231.0 253.0 202.0 0.0 70.0 236.0 253.0 253.0 253.0 253.0 170.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 22.0 139.0 253.0 213.0 26.0 13.0 200.0 253.0 253.0 183.0 252.0 253.0 220.0 22.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 72.0 253.0 253.0 129.0 0.0 86.0 253.0 253.0 129.0 4.0 105.0 253.0 253.0 70.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 72.0 253.0 253.0 77.0 22.0 245.0 253.0 183.0 4.0 0.0 2.0 105.0 253.0 70.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 132.0 253.0 253.0 11.0 24.0 253.0 253.0 116.0 0.0 0.0 1.0 150.0 253.0 70.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 189.0 253.0 241.0 10.0 24.0 253.0 253.0 59.0 0.0 0.0 82.0 253.0 212.0 30.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 189.0 253.0 147.0 0.0 24.0 253.0 253.0 150.0 30.0 44.0 208.0 212.0 31.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 189.0 253.0 174.0 3.0 7.0 185.0 253.0 253.0 227.0 247.0 184.0 30.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 150.0 253.0 253.0 145.0 95.0 234.0 253.0 253.0 253.0 126.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 72.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 169.0 14.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 114.0 240.0 253.0 253.0 234.0 135.0 44.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 139.0 212.0 253.0 159.0 86.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 34.0 89.0 203.0 253.0 252.0 252.0 252.0 252.0 74.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 49.0 184.0 234.0 252.0 252.0 184.0 110.0 100.0 208.0 252.0 199.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 95.0 233.0 252.0 252.0 176.0 56.0 0.0 0.0 0.0 17.0 234.0 249.0 75.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 220.0 253.0 178.0 54.0 4.0 0.0 0.0 0.0 0.0 43.0 240.0 243.0 50.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 221.0 255.0 180.0 55.0 5.0 0.0 0.0 0.0 7.0 160.0 253.0 168.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 116.0 253.0 252.0 252.0 67.0 0.0 0.0 0.0 91.0 252.0 231.0 42.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 32.0 190.0 252.0 252.0 185.0 38.0 0.0 119.0 234.0 252.0 54.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 15.0 177.0 252.0 252.0 179.0 155.0 236.0 227.0 119.0 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 26.0 221.0 252.0 252.0 253.0 252.0 130.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 32.0 229.0 253.0 255.0 144.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 66.0 236.0 252.0 253.0 92.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 66.0 234.0 252.0 252.0 253.0 92.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 19.0 236.0 252.0 252.0 252.0 253.0 92.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 53.0 181.0 252.0 168.0 43.0 232.0 253.0 92.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 179.0 255.0 218.0 32.0 93.0 253.0 252.0 84.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 81.0 244.0 239.0 33.0 0.0 114.0 252.0 209.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 207.0 252.0 237.0 70.0 153.0 240.0 252.0 32.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 207.0 252.0 253.0 252.0 252.0 252.0 210.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 61.0 242.0 253.0 252.0 168.0 96.0 12.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 68.0 254.0 255.0 254.0 107.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 176.0 230.0 253.0 253.0 253.0 212.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 28.0 197.0 253.0 253.0 253.0 253.0 253.0 229.0 107.0 14.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 194.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 53.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 69.0 241.0 253.0 253.0 253.0 253.0 241.0 186.0 253.0 253.0 195.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 10.0 161.0 253.0 253.0 253.0 246.0 40.0 57.0 231.0 253.0 253.0 195.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 140.0 253.0 253.0 253.0 253.0 154.0 0.0 25.0 253.0 253.0 253.0 195.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 213.0 253.0 253.0 253.0 135.0 8.0 0.0 3.0 128.0 253.0 253.0 195.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 77.0 238.0 253.0 253.0 253.0 7.0 0.0 0.0 0.0 116.0 253.0 253.0 195.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 165.0 253.0 253.0 231.0 70.0 1.0 0.0 0.0 0.0 78.0 237.0 253.0 195.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 33.0 253.0 253.0 253.0 182.0 0.0 0.0 0.0 0.0 0.0 0.0 200.0 253.0 195.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 98.0 253.0 253.0 253.0 24.0 0.0 0.0 0.0 0.0 0.0 0.0 42.0 253.0 195.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 197.0 253.0 253.0 253.0 24.0 0.0 0.0 0.0 0.0 0.0 0.0 163.0 253.0 195.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 197.0 253.0 253.0 189.0 13.0 0.0 0.0 0.0 0.0 0.0 53.0 227.0 253.0 121.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 197.0 253.0 253.0 114.0 0.0 0.0 0.0 0.0 0.0 21.0 227.0 253.0 231.0 27.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 197.0 253.0 253.0 114.0 0.0 0.0 0.0 5.0 131.0 143.0 253.0 231.0 59.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 197.0 253.0 253.0 236.0 73.0 58.0 217.0 223.0 253.0 253.0 253.0 174.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 197.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 48.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 149.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 253.0 182.0 15.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 12.0 168.0 253.0 253.0 253.0 253.0 253.0 248.0 89.0 23.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 7.0 67.0 141.0 205.0 255.0 255.0 153.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 45.0 57.0 121.0 188.0 253.0 253.0 254.0 253.0 253.0 253.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 111.0 198.0 241.0 253.0 254.0 253.0 253.0 215.0 179.0 253.0 253.0 165.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 242.0 253.0 253.0 253.0 191.0 116.0 28.0 16.0 79.0 253.0 253.0 40.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 114.0 114.0 13.0 0.0 0.0 0.0 0.0 142.0 254.0 207.0 13.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 26.0 217.0 253.0 143.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 151.0 254.0 234.0 37.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 226.0 254.0 197.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 48.0 242.0 252.0 75.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 160.0 253.0 201.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 45.0 241.0 253.0 114.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 57.0 253.0 253.0 114.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 180.0 254.0 242.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 54.0 253.0 253.0 116.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 141.0 253.0 253.0 28.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 141.0 253.0 177.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 205.0 254.0 56.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 26.0 254.0 253.0 81.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 25.0 254.0 253.0 235.0 22.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 204.0 228.0 103.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 13.0 29.0 29.0 66.0 28.0 0.0 0.0 10.0 179.0 242.0 47.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 19.0 144.0 253.0 252.0 252.0 215.0 170.0 82.0 28.0 209.0 253.0 84.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 123.0 252.0 253.0 252.0 252.0 252.0 253.0 240.0 72.0 210.0 253.0 84.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 151.0 246.0 252.0 178.0 28.0 28.0 28.0 253.0 151.0 91.0 252.0 253.0 84.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 16.0 179.0 253.0 178.0 0.0 0.0 0.0 0.0 166.0 91.0 229.0 253.0 201.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 47.0 196.0 252.0 103.0 0.0 0.0 0.0 0.0 16.0 215.0 252.0 252.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 131.0 252.0 228.0 38.0 0.0 0.0 0.0 204.0 252.0 252.0 127.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 32.0 228.0 252.0 226.0 38.0 38.0 213.0 253.0 252.0 127.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 85.0 253.0 255.0 203.0 253.0 253.0 214.0 38.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 28.0 184.0 253.0 252.0 252.0 202.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 29.0 184.0 253.0 252.0 252.0 28.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 26.0 159.0 252.0 253.0 252.0 252.0 178.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 120.0 253.0 253.0 114.0 194.0 253.0 253.0 63.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 170.0 225.0 233.0 96.0 0.0 131.0 252.0 252.0 38.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 89.0 253.0 252.0 80.0 0.0 13.0 206.0 252.0 202.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 38.0 225.0 253.0 102.0 6.0 0.0 13.0 206.0 252.0 102.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 86.0 253.0 251.0 75.0 0.0 0.0 104.0 253.0 206.0 13.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 110.0 252.0 244.0 144.0 95.0 169.0 253.0 252.0 142.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 110.0 252.0 253.0 252.0 252.0 252.0 244.0 93.0 13.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 10.0 128.0 253.0 252.0 202.0 102.0 25.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 15.0 108.0 233.0 253.0 255.0 180.0 101.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 36.0 219.0 252.0 252.0 252.0 253.0 252.0 227.0 50.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 85.0 222.0 252.0 233.0 141.0 69.0 79.0 227.0 252.0 160.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 116.0 253.0 235.0 64.0 0.0 0.0 0.0 161.0 252.0 160.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.0 128.0 18.0 0.0 0.0 0.0 22.0 244.0 252.0 108.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 97.0 253.0 184.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 38.0 99.0 253.0 244.0 98.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 13.0 153.0 240.0 252.0 253.0 240.0 101.0 13.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 99.0 252.0 252.0 252.0 253.0 252.0 252.0 215.0 19.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 26.0 221.0 210.0 137.0 23.0 96.0 221.0 252.0 128.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 70.0 253.0 253.0 64.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 25.0 223.0 252.0 116.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 207.0 252.0 116.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 207.0 252.0 116.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 64.0 248.0 252.0 116.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 138.0 253.0 253.0 53.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 47.0 34.0 0.0 0.0 5.0 136.0 252.0 252.0 157.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 24.0 252.0 234.0 90.0 70.0 191.0 252.0 252.0 227.0 16.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 24.0 252.0 252.0 252.0 252.0 253.0 235.0 128.0 29.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 13.0 211.0 252.0 252.0 252.0 137.0 60.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
-0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 85.0 255.0 103.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 205.0 253.0 253.0 30.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 205.0 253.0 253.0 30.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 44.0 233.0 253.0 244.0 27.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 135.0 253.0 253.0 100.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 153.0 253.0 240.0 76.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 12.0 208.0 253.0 166.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 69.0 253.0 253.0 142.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 14.0 110.0 253.0 235.0 33.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 63.0 223.0 235.0 130.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 186.0 253.0 235.0 37.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 17.0 145.0 253.0 231.0 35.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 69.0 220.0 231.0 123.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 18.0 205.0 253.0 176.0 27.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 17.0 125.0 253.0 185.0 39.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 71.0 214.0 231.0 41.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 167.0 253.0 225.0 33.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 72.0 205.0 207.0 14.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 30.0 249.0 233.0 49.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 32.0 253.0 89.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
diff --git a/pymic/test/runs/Feb19_16-56-35_uestc-MW50-SV0/data/scalar_group/arctanx/events.out.tfevents.1550566595.uestc-MW50-SV0 b/pymic/test/runs/Feb19_16-56-35_uestc-MW50-SV0/data/scalar_group/arctanx/events.out.tfevents.1550566595.uestc-MW50-SV0
deleted file mode 100644
index 1f53bf9..0000000
Binary files a/pymic/test/runs/Feb19_16-56-35_uestc-MW50-SV0/data/scalar_group/arctanx/events.out.tfevents.1550566595.uestc-MW50-SV0 and /dev/null differ
diff --git a/pymic/test/runs/Feb19_16-56-35_uestc-MW50-SV0/data/scalar_group/xcosx/events.out.tfevents.1550566595.uestc-MW50-SV0 b/pymic/test/runs/Feb19_16-56-35_uestc-MW50-SV0/data/scalar_group/xcosx/events.out.tfevents.1550566595.uestc-MW50-SV0
deleted file mode 100644
index 4b92db9..0000000
Binary files a/pymic/test/runs/Feb19_16-56-35_uestc-MW50-SV0/data/scalar_group/xcosx/events.out.tfevents.1550566595.uestc-MW50-SV0 and /dev/null differ
diff --git a/pymic/test/runs/Feb19_16-56-35_uestc-MW50-SV0/data/scalar_group/xsinx/events.out.tfevents.1550566595.uestc-MW50-SV0 b/pymic/test/runs/Feb19_16-56-35_uestc-MW50-SV0/data/scalar_group/xsinx/events.out.tfevents.1550566595.uestc-MW50-SV0
deleted file mode 100644
index 2ebaa94..0000000
Binary files a/pymic/test/runs/Feb19_16-56-35_uestc-MW50-SV0/data/scalar_group/xsinx/events.out.tfevents.1550566595.uestc-MW50-SV0 and /dev/null differ
diff --git a/pymic/test/runs/Feb19_16-56-35_uestc-MW50-SV0/events.out.tfevents.1550566595.uestc-MW50-SV0 b/pymic/test/runs/Feb19_16-56-35_uestc-MW50-SV0/events.out.tfevents.1550566595.uestc-MW50-SV0
deleted file mode 100644
index ee4f004..0000000
Binary files a/pymic/test/runs/Feb19_16-56-35_uestc-MW50-SV0/events.out.tfevents.1550566595.uestc-MW50-SV0 and /dev/null differ
diff --git a/pymic/test/runs/Feb19_16-56-35_uestc-MW50-SV0/projector_config.pbtxt b/pymic/test/runs/Feb19_16-56-35_uestc-MW50-SV0/projector_config.pbtxt
deleted file mode 100644
index 21a7552..0000000
--- a/pymic/test/runs/Feb19_16-56-35_uestc-MW50-SV0/projector_config.pbtxt
+++ /dev/null
@@ -1,24 +0,0 @@
-embeddings {
-tensor_name: "default:00000"
-tensor_path: "00000/default/tensors.tsv"
-metadata_path: "00000/default/metadata.tsv"
-sprite {
-image_path: "00000/default/sprite.png"
-single_image_dim: 28
-single_image_dim: 28
-}
-}
-embeddings {
-tensor_name: "noMetadata:00001"
-tensor_path: "00001/noMetadata/tensors.tsv"
-}
-embeddings {
-tensor_name: "default:00002"
-tensor_path: "00002/default/tensors.tsv"
-metadata_path: "00002/default/metadata.tsv"
-sprite {
-image_path: "00002/default/sprite.png"
-single_image_dim: 28
-single_image_dim: 28
-}
-}
diff --git a/pymic/test/test_assd.py b/pymic/test/test_assd.py
deleted file mode 100644
index 6b2732a..0000000
--- a/pymic/test/test_assd.py
+++ /dev/null
@@ -1,38 +0,0 @@
-from scipy import ndimage
-from PIL import Image
-import numpy as np
-import SimpleITK as sitk
-import matplotlib.pyplot as plt
-from pymic.util.evaluation_seg import get_edge_points
-
-def test_assd_2d():
- img_name = "/home/x/projects/PyMIC_project/PyMIC_examples/PyMIC_data/JSRT/label/JPCLN001.png"
- img = Image.open(img_name)
- img_array = np.asarray(img)
- img_edge = get_edge_points(img_array > 0)
- s_dis = ndimage.distance_transform_edt(1-img_edge)
- plt.subplot(1,2,1)
- plt.imshow(img_edge)
- plt.subplot(1,2,2)
- plt.imshow(s_dis)
- plt.show()
-
-def test_assd_3d():
- # img_name = "/home/x/projects/PyMIC_project/PyMIC_examples/seg_ssl/ACDC/result/unet2d_baseline/patient001_frame01.nii.gz"
- img_name = "/home/disk4t/data/heart/ACDC/preprocess/patient001_frame12_gt.nii.gz"
- img_obj = sitk.ReadImage(img_name)
- spacing = img_obj.GetSpacing()
- spacing = spacing[::-1]
- img_data = sitk.GetArrayFromImage(img_obj)
- print(img_data.shape)
- print(spacing)
- img_edge = get_edge_points(img_data > 0)
- s_dis = ndimage.distance_transform_edt(1-img_edge, sampling=spacing)
- dis_obj = sitk.GetImageFromArray(s_dis)
- dis_obj.CopyInformation(img_obj)
- sitk.WriteImage(dis_obj, "test_dis.nii.gz")
-
-
-
-if __name__ == "__main__":
- test_assd_3d()
\ No newline at end of file
diff --git a/pymic/test/test_net2d.py b/pymic/test/test_net2d.py
deleted file mode 100644
index 9013386..0000000
--- a/pymic/test/test_net2d.py
+++ /dev/null
@@ -1,68 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-
-import torch
-import numpy as np
-from pymic.net.net2d.unet2d import UNet2D
-from pymic.net.net2d.unet2d_scse import UNet2D_ScSE
-from pymic.net.net2d.umamba_bot import UMambaBot
-def test_unet2d():
- params = {'in_chns':4,
- 'feature_chns':[16, 32, 64, 128, 256],
- 'dropout': [0, 0, 0.3, 0.4, 0.5],
- 'class_num': 2,
- 'up_mode': 0,
- 'multiscale_pred': True}
- Net = UNet2D(params)
- Net = Net.double()
-
- x = np.random.rand(4, 4, 10, 256, 256)
- xt = torch.from_numpy(x)
- xt = torch.tensor(xt)
-
- out = Net(xt)
- if params['multiscale_pred']:
- for y in out:
- print(len(y.size()))
- y = y.detach().numpy()
- print(y.shape)
- else:
- print(out.shape)
-
-def test_unet2d_scse():
- params = {'in_chns':4,
- 'feature_chns':[16, 32, 64, 128, 256],
- 'dropout': [0, 0, 0.3, 0.4, 0.5],
- 'class_num': 2,
- 'up_mode': 0,
- 'multiscale_pred': True}
- Net = UNet2D_ScSE(params)
- Net = Net.double()
-
- x = np.random.rand(4, 4, 10, 256, 256)
- xt = torch.from_numpy(x)
- xt = torch.tensor(xt)
-
- out = Net(xt)
- if params['multiscale_pred']:
- for y in out:
- print(len(y.size()))
- y = y.detach().numpy()
- print(y.shape)
- else:
- print(out.shape)
-
-def test_umamba():
- x = np.random.rand(4, 4, 10, 256, 256)
- xt = torch.from_numpy(x)
- xt = torch.tensor(xt)
-
- Net = UMambaBot()
- out = Net(xt)
- y = out.detach().numpy()
- print(y.shape)
-
-if __name__ == "__main__":
- # test_unet2d()
- # test_unet2d_scse()
- test_umamba()
\ No newline at end of file
diff --git a/pymic/test/test_net3d.py b/pymic/test/test_net3d.py
deleted file mode 100644
index 058a6fd..0000000
--- a/pymic/test/test_net3d.py
+++ /dev/null
@@ -1,203 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-
-import torch
-import numpy as np
-from pymic.net.net3d.unet3d import UNet3D
-from pymic.net.net3d.unet3d_scse import UNet3D_ScSE
-from pymic.net.net3d.unet2d5 import UNet2D5
-from pymic.net.net3d.grunet import GRUNet
-from pymic.net.net3d.lcovnet import LCOVNet
-from pymic.net.net3d.trans3d.unetr_pp import UNETR_PP
-
-def test_unet3d():
- params = {'in_chns':4,
- 'class_num': 2,
- 'feature_chns':[2, 8, 32, 64],
- 'dropout' : [0, 0, 0, 0.5],
- 'up_mode': 2,
- 'multiscale_pred': False}
- Net = UNet3D(params)
- Net = Net.double()
-
- x = np.random.rand(4, 4, 96, 96, 96)
- xt = torch.from_numpy(x)
- xt = torch.tensor(xt)
-
- y = Net(xt)
- y = y.detach().numpy()
- print(y.shape)
-
- params = {'in_chns':4,
- 'class_num': 2,
- 'feature_chns':[2, 8, 32, 64, 128],
- 'dropout' : [0, 0, 0, 0.4, 0.5],
- 'up_mode': 3,
- 'multiscale_pred': True}
- Net = UNet3D(params)
- Net = Net.double()
-
- x = np.random.rand(4, 4, 96, 128, 128)
- xt = torch.from_numpy(x)
- xt = torch.tensor(xt)
-
- out = Net(xt)
- for y in out:
- y = y.detach().numpy()
- print(y.shape)
-
-def test_unet3d_scse():
- params = {'in_chns':4,
- 'feature_chns':[2, 8, 32, 48, 64],
- 'dropout': [0, 0, 0.3, 0.4, 0.5],
- 'class_num': 2,
- 'up_mode': 2}
- Net = UNet3D_ScSE(params)
- Net = Net.double()
-
- x = np.random.rand(4, 4, 96, 96, 96)
- xt = torch.from_numpy(x)
- xt = torch.tensor(xt)
-
- y = Net(xt)
- print(len(y.size()))
- y = y.detach().numpy()
- print(y.shape)
-
-def test_lcovnet():
- params = {'in_chns':4,
- 'feature_chns':[16, 32, 64, 128, 256],
- 'class_num': 2}
- Net = LCOVNet(params)
- Net = Net.double()
-
- x = np.random.rand(4, 4, 96, 96, 96)
- xt = torch.from_numpy(x)
- xt = xt.clone().detach()
-
- y = Net(xt)
- print(len(y.size()))
- y = y.detach().numpy()
- print(y.shape)
-
-def test_unet2d5():
- params = {'in_chns':4,
- 'feature_chns':[8, 16, 32, 64, 128],
- 'conv_dims': [2, 2, 3, 3, 3],
- 'dropout': [0, 0, 0.3, 0.4, 0.5],
- 'class_num': 2,
- 'up_mode': 2,
- 'multiscale_pred': True}
- Net = UNet2D5(params)
- Net = Net.double()
-
- x = np.random.rand(4, 4, 32, 128, 128)
- xt = torch.from_numpy(x)
- xt = torch.tensor(xt)
-
- out = Net(xt)
- for y in out:
- y = y.detach().numpy()
- print(y.shape)
-
- params = {'in_chns':4,
- 'feature_chns':[8, 16, 32, 64, 128],
- 'conv_dims': [2, 3, 3, 3, 3],
- 'dropout': [0, 0, 0.3, 0.4, 0.5],
- 'class_num': 2,
- 'up_mode': 0,
- 'multiscale_pred': True}
- Net = UNet2D5(params)
- Net = Net.double()
-
- x = np.random.rand(4, 4, 64, 128, 128)
- xt = torch.from_numpy(x)
- xt = torch.tensor(xt)
-
- out = Net(xt)
- for y in out:
- y = y.detach().numpy()
- print(y.shape)
-
-def test_mystunet():
- in_chns = 4
- num_class = 4
- # input_channels, num_classes, depth=[1,1,1,1,1,1], dims=[32, 64, 128, 256, 512, 512],
- # pool_op_kernel_sizes=None, conv_kernel_sizes=None)
- dims=[16, 32, 64, 128, 256, 512]
- Net = MySTUNet(in_chns, num_class, dims = dims, pool_op_kernel_sizes = [[2, 2, 2], [2,2,2], [2,2,2], [2,2,2], [1, 1, 1]],
- conv_kernel_sizes = [[3, 3, 3], [3,3,3], [3,3,3], [3,3,3], [3,3,3], [3, 3, 3]])
- Net = Net.double()
-
- x = np.random.rand(4, 4, 96, 96, 96)
- xt = torch.from_numpy(x)
- xt = torch.tensor(xt)
-
- out = Net(xt)
- for y in out:
- y = y.detach().numpy()
- print(y.shape)
-
-def test_grunet():
- params = {'in_chns':4,
- 'feature_chns':[8, 16, 32, 64, 128],
- 'dims': [2, 3, 3, 3, 3],
- 'dropout': [0, 0, 0.3, 0.4, 0.5],
- 'class_num': 2,
- 'depth': 2,
- 'multiscale_pred': True}
- x = np.random.rand(4, 4, 64, 128, 128)
-
- # params = {'in_chns':4,
- # 'feature_chns':[8, 16, 32, 64, 128],
- # 'dims': [3, 3, 3, 3, 3],
- # 'dropout': [0, 0, 0.3, 0.4, 0.5],
- # 'class_num': 2,
- # 'depth': 4,
- # 'multiscale_pred': True}
- # x = np.random.rand(4, 4, 96, 96, 96)
-
- Net = GRUNet(params)
- Net = Net.double()
-
- xt = torch.from_numpy(x)
- xt = torch.tensor(xt)
-
- out = Net(xt)
- for y in out:
- y = y.detach().numpy()
- print(y.shape)
-
-def test_unetr_pp():
- depths = [128, 64, 32]
- for i in range(3):
- params = {'in_chns': 4,
- 'class_num': 2,
- 'img_size': [depths[i], 128, 128],
- 'resolution_mode': i
- }
- net = UNETR_PP(params)
- net.double()
-
- x = np.random.rand(2, 4, depths[i], 128, 128)
- xt = torch.from_numpy(x)
- xt = torch.tensor(xt)
-
- y = net(xt)
- print(len(y))
- for yi in y:
- yi = yi.detach().numpy()
- print(yi.shape)
-
-
-
-if __name__ == "__main__":
- # test_unet3d()
- # test_unet3d_scse()
- test_lcovnet()
- # test_unetr_pp()
- # test_unet2d5()
- # test_mystunet()
- # test_fmunetv2()
-
-
\ No newline at end of file
diff --git a/pymic/test/test_nifty_dataset.py b/pymic/test/test_nifty_dataset.py
deleted file mode 100644
index b5c4660..0000000
--- a/pymic/test/test_nifty_dataset.py
+++ /dev/null
@@ -1,68 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-import sys
-import numpy as np
-from pymic.util.parse_config import *
-from pymic.net_run.agent_cls import ClassificationAgent
-from pymic.net_run.agent_seg import SegmentationAgent
-import SimpleITK as sitk
-
-def save_array_as_nifty_volume(data, image_name, reference_name = None):
- """
- Save a numpy array as nifty image
-
- :param data: (numpy.ndarray) A numpy array with shape [Depth, Height, Width].
- :param image_name: (str) The ouput file name.
- :param reference_name: (str) File name of the reference image of which
- meta information is used.
- """
- img = sitk.GetImageFromArray(data)
- if(reference_name is not None):
- img_ref = sitk.ReadImage(reference_name)
- #img.CopyInformation(img_ref)
- img.SetSpacing(img_ref.GetSpacing())
- img.SetOrigin(img_ref.GetOrigin())
- img.SetDirection(img_ref.GetDirection())
- sitk.WriteImage(img, image_name)
-
-def main():
- """
- The main function for running a network for training or inference.
- """
- if(len(sys.argv) < 3):
- print('Number of arguments should be 3. e.g.')
- print('python test_nifty_dataset.py train config.cfg')
- exit()
- stage = str(sys.argv[1])
- cfg_file = str(sys.argv[2])
- config = parse_config(cfg_file)
- config = synchronize_config(config)
- # task = config['dataset']['task_type']
- # assert task in ['cls', 'cls_nexcl', 'seg']
- # if(task == 'cls' or task == 'cls_nexcl'):
- # agent = ClassificationAgent(config, stage)
- # else:
- # agent = SegmentationAgent(config, stage)
- agent = SegmentationAgent(config, stage)
- agent.create_dataset()
- data_loader = agent.train_loader if stage == "train" else agent.test_loader
- it = 0
- for data in data_loader:
- inputs = agent.convert_tensor_type(data['image'])
- labels_prob = agent.convert_tensor_type(data['label_prob'])
- for i in range(inputs.shape[0]):
- image_i = inputs[i][0]
- label_i = np.argmax(labels_prob[i], axis = 0)
- print(image_i.shape, label_i.shape)
- image_name = "temp/image_{0:}_{1:}.nii.gz".format(it, i)
- label_name = "temp/label_{0:}_{1:}.nii.gz".format(it, i)
- save_array_as_nifty_volume(image_i, image_name, reference_name = None)
- save_array_as_nifty_volume(label_i, label_name, reference_name = None)
- it = it + 1
- if(it == 10):
- break
-
-if __name__ == "__main__":
- main()
-
-
diff --git a/pymic/test/test_tensorboard.py b/pymic/test/test_tensorboard.py
deleted file mode 100644
index 4a49e0f..0000000
--- a/pymic/test/test_tensorboard.py
+++ /dev/null
@@ -1,142 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-
-import torch
-import torchvision
-import torchvision.transforms as transforms
-import numpy as np
-import time
-import torch.nn as nn
-import torch.nn.functional as F
-import torch.optim as optim
-
-from datetime import datetime
-from tensorboardX import SummaryWriter
-from pymic.io.image_read_write import *
-from pymic.io.nifty_dataset import NiftyDataset
-from pymic.io.transform3d import *
-from pymic.net.unet3d import UNet3D
-from pymic.net.demonet import DemoNet
-
-
-def get_soft_label(input_tensor, num_class):
- """
- convert a label tensor to soft label
- input_tensor: tensor with shae [B, 1, D, H, W]
- output_tensor: shape [B, num_class, D, H, W]
- """
- tensor_list = []
- for i in range(num_class):
- temp_prob = input_tensor == i*torch.ones_like(input_tensor)
- tensor_list.append(temp_prob)
- output_tensor = torch.cat(tensor_list, dim = 1)
- output_tensor = output_tensor.double()
-
- return output_tensor
-
-def soft_dice_loss(predict, soft_y, num_class, softmax = True):
- soft_y = soft_y.permute(0, 2, 3, 4, 1)
- soft_y = torch.reshape(soft_y, (-1, num_class))
- predict = predict.permute(0, 2, 3, 4, 1)
- predict = torch.reshape(predict, (-1, num_class))
- if(softmax):
- predict = nn.Softmax(dim = -1)(predict)
- y_vol = torch.sum(soft_y, dim = 0)
- p_vol = torch.sum(predict, dim = 0)
- intersect = torch.sum(soft_y * predict, dim = 0)
- dice_score = (2.0 * intersect + 1e-5)/ (y_vol + p_vol + 1e-5)
- dice_score = torch.mean(dice_score)
- return 1.0 - dice_score
-
-if __name__ == "__main__":
- root_dir = '/home/guotai/data/brats/BraTS2018_Training'
- train_csv_file = '/home/guotai/projects/torch_brats/brats/config/brats18_train_train.csv'
- valid_csv_file = '/home/guotai/projects/torch_brats/brats/config/brats18_train_valid.csv'
-
- crop1 = CropWithBoundingBox(start = None, output_size = [4, 144, 176, 144])
- scale = Rescale(output_size = [96, 128, 96])
- norm = ChannelWiseNormalize(mean = None, std = None, zero_to_random = True)
- labconv = LabelConvert([0, 1, 2, 4], [0, 1, 2, 3])
- crop2 = RandomCrop([80, 80, 80])
- transform_list = [crop1, scale, norm, labconv, crop2]
- train_dataset = NiftyDataset(root_dir=root_dir,
- csv_file = train_csv_file,
- modal_num = 4,
- with_label= True,
- transform = transforms.Compose(transform_list))
- valid_dataset = NiftyDataset(root_dir=root_dir,
- csv_file = valid_csv_file,
- modal_num = 4,
- with_label= True,
- transform = transforms.Compose(transform_list))
- trainloader = torch.utils.data.DataLoader(train_dataset, batch_size=2,
- shuffle=True, num_workers=8)
- validloader = torch.utils.data.DataLoader(valid_dataset, batch_size=2,
- shuffle=True, num_workers=8)
- trainIter = iter(trainloader)
-
- params = {'input_chn_num':4,
- 'feature_chn_nums':[4, 16, 32, 64, 128],
- 'class_num': 4,
- 'acti_func': 'leakyrelu'}
- net = UNet3D(params)
- net.double()
- device = torch.device("cuda:1" if torch.cuda.is_available() else "cpu")
- # Assuming that we are on a CUDA machine, this should print a CUDA device:
- print('device', device)
- net.to(device)
-
- optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)
- summ_writer = SummaryWriter("brats/model/multi_cls2")
- min_iter = 10000
- max_iter = 15000
- valid_gap = 100
- save_iter = 1000
- running_loss = 0
- if(min_iter > 0):
- net.load_state_dict(torch.load("brats/model/multi_cls2_{0:}.pt".format(min_iter)))
- net.eval()
- for it in range(min_iter, max_iter):
- try:
- data = next(trainIter)
- except StopIteration:
- trainIter = iter(trainloader)
- data = next(trainIter)
-
- # get the inputs
- inputs, labels = data['image'].double(), data['label']
- inputs, labels = inputs.to(device), labels.to(device)
- # zero the parameter gradients
- optimizer.zero_grad()
-
- # forward + backward + optimize
- outputs = net(inputs)
- soft_y = get_soft_label(labels,params['class_num'])
- loss = soft_dice_loss(outputs, soft_y, params['class_num'])
- loss_value = loss.item()
- loss.backward()
- optimizer.step()
-
- # print statistics
- running_loss = running_loss + loss.item()
- if (it % valid_gap == valid_gap - 1):
- train_avg_loss = running_loss / valid_gap
- valid_loss = 0.0
- with torch.no_grad():
- for data in validloader:
- inputs, labels = data['image'].double(), data['label']
- inputs, labels = inputs.to(device), labels.to(device)
- outputs = net(inputs)
- soft_y = get_soft_label(labels,params['class_num'])
- loss = soft_dice_loss(outputs, soft_y, params['class_num'])
- valid_loss = valid_loss + loss.item()
- valid_avg_loss = valid_loss / len(validloader)
- scalers = {'train':train_avg_loss, 'valid': valid_avg_loss}
- summ_writer.add_scalars('loss', scalers, it + 1)
- running_loss = 0.0
- print("{0:} it {1:}, loss {2:}, {3:}".format(
- datetime.now(), it + 1, train_avg_loss, valid_avg_loss))
- if (it % save_iter == save_iter - 1):
- torch.save(net.state_dict(), "brats/model/multi_cls2_{0:}.pt".format(it + 1))
- summ_writer.close()
-
diff --git a/pymic/transform/__init__.py b/pymic/transform/__init__.py
deleted file mode 100644
index b47e09d..0000000
--- a/pymic/transform/__init__.py
+++ /dev/null
@@ -1,13 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import absolute_import
-from pymic.transform.intensity import *
-from pymic.transform.flip import *
-from pymic.transform.pad import *
-from pymic.transform.rotate import *
-from pymic.transform.rescale import *
-from pymic.transform.transpose import *
-from pymic.transform.threshold import *
-from pymic.transform.normalize import *
-from pymic.transform.crop import *
-from pymic.transform.label_convert import *
-from pymic.transform.trans_dict import TransformDict
\ No newline at end of file
diff --git a/pymic/transform/abstract_transform.py b/pymic/transform/abstract_transform.py
deleted file mode 100644
index 5556ee0..0000000
--- a/pymic/transform/abstract_transform.py
+++ /dev/null
@@ -1,25 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-
-class AbstractTransform(object):
- """
- The abstract class for Transform.
- """
- def __init__(self, params):
- self.task = params['Task'.lower()]
-
- def __call__(self, sample):
- """
- Forward pass of the transform.
-
- :arg sample: (dict) A dictionary for the input sample obtained by dataloader.
- """
- return sample
-
- def inverse_transform_for_prediction(self, sample):
- """
- Inverse transform for the sample dictionary.
- Especially, it will update sample['predict'] obtained by a network's
- prediction based on the inverse transform. This function is only useful for spatial transforms.
- """
- raise(ValueError("not implemented"))
diff --git a/pymic/transform/affine.py b/pymic/transform/affine.py
deleted file mode 100644
index 1717a97..0000000
--- a/pymic/transform/affine.py
+++ /dev/null
@@ -1,156 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-
-import torch
-import json
-import math
-import random
-import numpy as np
-from skimage import transform
-from scipy import ndimage
-from pymic import TaskType
-from pymic.transform.abstract_transform import AbstractTransform
-from pymic.util.image_process import *
-
-class Affine(AbstractTransform):
- """
- Apply Affine Transform to an ND volume in the x-y plane.
- Input shape should be [C, D, H, W] or [C, H, W].
-
- The arguments should be written in the `params` dictionary, and it has the
- following fields:
-
- :param `Affine_scale_range`: (list or tuple) The range for scaling, e.g., (0.5, 2.0)
- :param `Affine_shear_range`: (list or tuple) The range for shearing angle, e.g., (0, 30)
- :param `Affine_rotate_range`: (list or tuple) The range for rotation, e.g., (-45, 45)
- :param `Affine_output_size`: (None, list or tuple of length 2) The output size after affine transformation.
- For 3D volumes, as we only apply affine transformation in x-y plane, the output slice
- number will be the same as the input slice number, so only the output height and width
- need to be given here, e.g., (H, W). By default (`None`), the output size will be the
- same as the input size.
- """
- def __init__(self, params):
- super(Affine, self).__init__(params)
- self.scale_range = params['Affine_scale_range'.lower()]
- self.shear_range = params['Affine_shear_range'.lower()]
- self.rotat_range = params['Affine_rotate_range'.lower()]
- self.output_shape= params.get('Affine_output_size'.lower(), None)
- self.inverse = params.get('Affine_inverse'.lower(), True)
-
- def _get_affine_param(self, sample, output_shape):
- """
- output_shape should only has two dimensions, e.g., (H, W)
- """
- input_shape = sample['image'].shape
- input_dim = len(input_shape) - 1
- assert(len(output_shape) >=2)
-
- in_y, in_x = input_shape[-2:]
- out_y, out_x = output_shape[-2:]
- points = [[0, out_y],
- [0, 0],
- [out_x, 0],
- [out_x, out_y]]
-
- sx = random.random() * (self.scale_range[1] - self.scale_range[0]) + self.scale_range[0]
- sy = random.random() * (self.scale_range[1] - self.scale_range[0]) + self.scale_range[0]
- shx = (random.random() * (self.shear_range[1] - self.shear_range[0]) + self.shear_range[0]) * 3.14159/180
- shy = (random.random() * (self.shear_range[1] - self.shear_range[0]) + self.shear_range[0]) * 3.14159/180
- rot = (random.random() * (self.rotat_range[1] - self.rotat_range[0]) + self.rotat_range[0]) * 3.14159/180
- # get affine transform parameters
- new_points = []
- for p in points:
- x = sx * p[0] * (math.cos(rot) + math.tan(shy) * math.sin(rot)) - \
- sy * p[1] * (math.tan(shx) * math.cos(rot) + math.sin(rot))
- y = sx * p[0] * (math.sin(rot) - math.tan(shy) * math.cos(rot)) - \
- sy * p[1] * (math.tan(shx) * math.sin(rot) - math.cos(rot))
- new_points.append([x,y])
- bb_min = np.array(new_points).min(axis = 0)
- bb_max = np.array(new_points).max(axis = 0)
- bbx, bby = int(bb_max[0] - bb_min[0]), int(bb_max[1] - bb_min[1])
- # transform the points to the image coordinate
- margin_x = in_x - bbx
- margin_y = in_y - bby
- p0x = random.random() * margin_x if margin_x > 0 else margin_x / 2
- p0y = random.random() * margin_y if margin_y > 0 else margin_y / 2
- dst = [[new_points[i][0] - bb_min[0] + p0x, new_points[i][1] - bb_min[1] + p0y] \
- for i in range(3)]
-
- tform = transform.AffineTransform()
- tform.estimate(np.array(points[:3]), np.array(dst))
- # to do: need to find a solution to save the affine transform matrix
- # Use the matplotlib.transforms.Affine2D function to generate transform matrices,
- # and the scipy.ndimage.warp function to warp images using the transform matrices.
- # The skimage AffineTransform shear functionality is weird,
- # and the scipy affine_transform function for warping images swaps the X and Y axes.
- # sample['Affine_Param'] = json.dumps((input_shape, tform["matrix"]))
- return sample, tform
-
- def _apply_affine_to_ND_volume(self, image, output_shape, tform, order = 2):
- """
- output_shape should only has two dimensions, e.g., (H, W)
- """
- dim = len(image.shape) - 1
- if(dim == 2):
- C, H, W = image.shape
- output = np.zeros([C] + output_shape)
- for c in range(C):
- output[c] = ndimage.affine_transform(image[c], tform,
- output_shape = output_shape, mode='mirror', order = order)
- elif(dim == 3):
- C, D, H, W = image.shape
- output = np.zeros([C, D] + output_shape)
- for c in range(C):
- for d in range(D):
- output[c,d] = ndimage.affine_transform(image[c,d], tform,
- output_shape = output_shape, mode='mirror', order = order)
- return output
-
- def __call__(self, sample):
- image = sample['image']
- input_shape = sample['image'].shape
- output_shape= input_shape if self.output_shape is None else self.output_shape
- aff_out_shape = output_shape[-2:]
- sample, tform = self._get_affine_param(sample, aff_out_shape)
- image_t = self._apply_affine_to_ND_volume(image, aff_out_shape, tform)
- sample['image'] = image_t
-
- if('label' in sample and \
- self.task in [TaskType.SEGMENTATION, TaskType.RECONSTRUCTION]):
- label = sample['label']
- label = self._apply_affine_to_ND_volume(label, aff_out_shape, tform, order = 0)
- sample['label'] = label
- if('pixel_weight' in sample and \
- self.task in [TaskType.SEGMENTATION, TaskType.RECONSTRUCTION]):
- weight = sample['pixel_weight']
- weight = self._apply_affine_to_ND_volume(weight, aff_out_shape, tform)
- sample['pixel_weight'] = weight
- return sample
-
- def _get_param_for_inverse_transform(self, sample):
- if(isinstance(sample['Affine_Param'], list) or \
- isinstance(sample['Affine_Param'], tuple)):
- params = json.loads(sample['Affine_Param'][0])
- else:
- params = json.loads(sample['Affine_Param'])
- return params
-
- # def inverse_transform_for_prediction(self, sample):
- # params = self._get_param_for_inverse_transform(sample)
- # origin_shape = params[0]
- # tform = params[1]
-
- # predict = sample['predict']
- # if(isinstance(predict, tuple) or isinstance(predict, list)):
- # output_predict = []
- # for predict_i in predict:
- # aff_out_shape = origin_shape[-2:]
- # output_predict_i = self._apply_affine_to_ND_volume(predict_i,
- # aff_out_shape, tform.inverse)
- # output_predict.append(output_predict_i)
- # else:
- # aff_out_shape = origin_shape[-2:]
- # output_predict = self._apply_affine_to_ND_volume(predict, aff_out_shape, tform.inverse)
-
- # sample['predict'] = output_predict
- # return sample
diff --git a/pymic/transform/crop.py b/pymic/transform/crop.py
deleted file mode 100644
index c444acd..0000000
--- a/pymic/transform/crop.py
+++ /dev/null
@@ -1,503 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-
-import torch
-import json
-import math
-import random
-import numpy as np
-from scipy import ndimage
-from pymic import TaskType
-from pymic.transform.abstract_transform import AbstractTransform
-from pymic.util.image_process import *
-
-class CenterCrop(AbstractTransform):
- """
- Crop the given image at the center.
- Input shape should be [C, D, H, W] or [C, H, W].
-
- The arguments should be written in the `params` dictionary, and it has the
- following fields:
-
- :param `CenterCrop_output_size`: (list or tuple) The output size.
- [D, H, W] for 3D images and [H, W] for 2D images.
- If D is None, then the z-axis is not cropped.
- :param `CenterCrop_inverse`: (optional, bool) Is inverse transform needed for inference.
- Default is `True`.
- """
- def __init__(self, params):
- super(CenterCrop, self).__init__(params)
- self.output_size = params['CenterCrop_output_size'.lower()]
- self.inverse = params.get('CenterCrop_inverse'.lower(), True)
-
- def _get_crop_param(self, sample):
- input_shape = sample['image'].shape
- input_dim = len(input_shape) - 1
- assert(input_dim == len(self.output_size))
- temp_output_size = self.output_size
- if(input_dim == 3 and self.output_size[0] is None):
- # note that output size is [D, H, W] and input is [C, D, H, W]
- temp_output_size = [input_shape[1]] + self.output_size[1:]
-
- crop_margin = [input_shape[i + 1] - temp_output_size[i]\
- for i in range(input_dim)]
- crop_min = [int(item/2) for item in crop_margin]
- crop_max = [crop_min[i] + temp_output_size[i] \
- for i in range(input_dim)]
- crop_min = [0] + crop_min
- crop_max = list(input_shape[0:1]) + crop_max
- sample['CenterCrop_Param'] = json.dumps((input_shape, crop_min, crop_max))
- return sample, crop_min, crop_max
-
- def __call__(self, sample):
- image = sample['image']
- sample, crop_min, crop_max = self._get_crop_param(sample)
-
- image_t = crop_ND_volume_with_bounding_box(image, crop_min, crop_max)
- sample['image'] = image_t
-
- if('label' in sample and \
- self.task in [TaskType.SEGMENTATION, TaskType.RECONSTRUCTION]):
- label = sample['label']
- crop_max[0] = label.shape[0]
- label = crop_ND_volume_with_bounding_box(label, crop_min, crop_max)
- sample['label'] = label
- if('pixel_weight' in sample and \
- self.task in [TaskType.SEGMENTATION, TaskType.RECONSTRUCTION]):
- weight = sample['pixel_weight']
- crop_max[0] = weight.shape[0]
- weight = crop_ND_volume_with_bounding_box(weight, crop_min, crop_max)
- sample['pixel_weight'] = weight
- return sample
-
- def _get_param_for_inverse_transform(self, sample):
- if(isinstance(sample['CenterCrop_Param'], list) or \
- isinstance(sample['CenterCrop_Param'], tuple)):
- params = json.loads(sample['CenterCrop_Param'][0])
- else:
- params = json.loads(sample['CenterCrop_Param'])
- return params
-
- def inverse_transform_for_prediction(self, sample):
- params = self._get_param_for_inverse_transform(sample)
- origin_shape = params[0]
- crop_min = params[1]
- crop_max = params[2]
- predict = sample['predict']
- if(isinstance(predict, tuple) or isinstance(predict, list)):
- output_predict = []
- for predict_i in predict:
- origin_shape_i = list(predict_i.shape[:2]) + origin_shape[1:]
- output_predict_i = np.zeros(origin_shape_i, predict_i.dtype)
- crop_min_i = [0, 0] + crop_min[1:]
- crop_max_i = list(predict_i.shape[:2]) + crop_max[1:]
- output_predict_i = set_ND_volume_roi_with_bounding_box_range(output_predict_i,
- crop_min_i, crop_max_i, predict_i)
- output_predict.append(output_predict_i)
- else:
- origin_shape = list(predict.shape[:2]) + origin_shape[1:]
- output_predict = np.zeros(origin_shape, predict.dtype)
- crop_min = [0, 0] + crop_min[1:]
- crop_max = list(predict.shape[:2]) + crop_max[1:]
- output_predict = set_ND_volume_roi_with_bounding_box_range(output_predict,
- crop_min, crop_max, predict)
-
- sample['predict'] = output_predict
- return sample
-
-class CropWithBoundingBox(CenterCrop):
- """
- Crop the image (shape [C, D, H, W] or [C, H, W]) based on a bounding box.
- The arguments should be written in the `params` dictionary, and it has the
- following fields:
-
- :param `CropWithBoundingBox_start`: (None, or list/tuple) The start index
- along each spatial axis. If None, calculate the start index automatically
- so that the cropped region is centered at the mask region defined by the threshold.
- :param `CropWithBoundingBox_output_size`: (None or tuple/list):
- Desired spatial output size.
- If None, set it as the size of bounding box of the mask region defined by the threshold.
- :param `CropWithBoundingBox_threshold`: (None or float):
- Threshold for obtaining a mask. This is used only when
- `CropWithBoundingBox_start` is None. Default is 1.0
- :param `CropWithBoundingBox_inverse`: (optional, bool) Is inverse transform needed for inference.
- Default is `True`.
- """
- def __init__(self, params):
- self.start = params['CropWithBoundingBox_start'.lower()]
- self.output_size = params['CropWithBoundingBox_output_size'.lower()]
- self.threshold = params.get('CropWithBoundingBox_threshold'.lower(), 1.0)
- self.inverse = params.get('CropWithBoundingBox_inverse'.lower(), True)
- self.task = params['task']
-
- def _get_crop_param(self, sample):
- image = sample['image']
- input_shape = sample['image'].shape
- input_dim = len(input_shape) - 1
- if(self.start is None or self.output_size is None):
- bb_min, bb_max = get_ND_bounding_box(image > self.threshold)
- bb_min, bb_max = bb_min[1:], bb_max[1:]
- if(self.start is None):
- if(self.output_size is None):
- crop_min, crop_max = bb_min, bb_max
- else:
- assert(len(self.output_size) == input_dim)
- crop_min = [int((bb_min[i] + bb_max[i] + 1)/2) - int(self.output_size[i]/2) \
- for i in range(input_dim)]
- crop_min = [max(0, crop_min[i]) for i in range(input_dim)]
- crop_max = [crop_min[i] + self.output_size[i] for i in range(input_dim)]
- else:
- assert(len(self.start) == input_dim)
- crop_min = self.start
- if(self.output_size is None):
- assert(len(self.output_size) == input_dim)
- crop_max = [crop_min[i] + bb_max[i] - bb_min[i] \
- for i in range(input_dim)]
- else:
- crop_max = [crop_min[i] + self.output_size[i] for i in range(input_dim)]
- crop_min = [0] + crop_min
- crop_max = list(input_shape[0:1]) + crop_max
- sample['CropWithBoundingBox_Param'] = json.dumps((input_shape, crop_min, crop_max))
- return sample, crop_min, crop_max
-
- def _get_param_for_inverse_transform(self, sample):
- if(isinstance(sample['CropWithBoundingBox_Param'], list) or \
- isinstance(sample['CropWithBoundingBox_Param'], tuple)):
- params = json.loads(sample['CropWithBoundingBox_Param'][0])
- else:
- params = json.loads(sample['CropWithBoundingBox_Param'])
- return params
-
-class CropWithForeground(CenterCrop):
- """
- Crop the image (shape [C, D, H, W] or [C, H, W]) based on a bounding box.
- The arguments should be written in the `params` dictionary, and it has the
- following fields:
-
- :param `CropWithBoundingBox_start`: (None, or list/tuple) The start index
- along each spatial axis. If None, calculate the start index automatically
- so that the cropped region is centered at the non-zero region.
- :param `CropWithBoundingBox_output_size`: (None or tuple/list):
- Desired spatial output size.
- If None, set it as the size of bounding box of non-zero region.
- :param `CropWithBoundingBox_inverse`: (optional, bool) Is inverse transform needed for inference.
- Default is `True`.
- """
- def __init__(self, params):
- self.labels = params.get('CropWithForeground_labels'.lower(), None)
- self.margin = params.get('CropWithForeground_margin'.lower(), [5, 10, 10])
- self.inverse = params.get('CropWithForeground_inverse'.lower(), True)
- self.task = params['task']
-
- def _get_crop_param(self, sample):
- image = sample['image']
- label = sample['label']
- input_shape = sample['image'].shape
-
- bb_min, bb_max = get_ND_bounding_box(label, margin=[0] + self.margin)
- bb_max[0] = input_shape[0]
-
- sample['CropWithForeground_Param'] = json.dumps((input_shape, bb_min, bb_max))
-
- return sample, bb_min, bb_max
-
- def _get_param_for_inverse_transform(self, sample):
- if(isinstance(sample['CropWithForeground_Param'], list) or \
- isinstance(sample['CropWithForeground_Param'], tuple)):
- params = json.loads(sample['CropWithForeground_Param'][0])
- else:
- params = json.loads(sample['CropWithForeground_Param'])
- return params
-
-class RandomCrop(CenterCrop):
- """Randomly crop the input image (shape [C, D, H, W] or [C, H, W]).
-
- The arguments should be written in the `params` dictionary, and it has the
- following fields:
-
- :param `RandomCrop_output_size`: (list/tuple) Desired output size [D, H, W] or [H, W].
- The output channel is the same as the input channel.
- If `None` is set for a certain axis, that axis will not be cropped. For example,
- for 3D vlumes, (None, H, W) means only crop in 2D, and (D, None, None) means only
- crop along the z axis.
- :param `RandomCrop_foreground_focus`: (optional, bool)
- If true, allow crop around the foreground. Default is False.
- :param `RandomCrop_foreground_ratio`: (optional, float)
- Specifying the probability of foreground focus cropping when
- `RandomCrop_foreground_focus` is True.
- :param `RandomCrop_mask_label`: (optional, None, or list/tuple)
- Specifying the foreground labels for foreground focus cropping when
- `RandomCrop_foreground_focus` is True. If it is None (by default),
- the mask label will be the list of all the foreground classes.
- :param `RandomCrop_inverse`: (optional, bool) Is inverse transform needed for inference.
- Default is `True`.
- """
- def __init__(self, params):
- self.output_size = params['RandomCrop_output_size'.lower()]
- self.fg_focus = params.get('RandomCrop_foreground_focus'.lower(), False)
- self.fg_ratio = params.get('RandomCrop_foreground_ratio'.lower(), 0.5)
- self.mask_label = params.get('RandomCrop_mask_label'.lower(), None)
- self.inverse = params.get('RandomCrop_inverse'.lower(), True)
- self.task = params['Task'.lower()]
- assert isinstance(self.output_size, (list, tuple))
- if(self.mask_label is not None):
- assert isinstance(self.mask_label, (list, tuple))
-
- def _get_crop_param(self, sample):
- image = sample['image']
- chns = image.shape[0]
- input_shape = image.shape[1:]
- input_dim = len(input_shape)
- assert(input_dim == len(self.output_size))
-
- output_size = [item for item in self.output_size]
- # print("crop input and output size", input_shape, output_size)
- for i in range(input_dim):
- if(output_size[i] is None):
- output_size[i] = input_shape[i]
- # print(output_size)
- crop_margin = [input_shape[i] - output_size[i] for i in range(input_dim)]
- crop_min = [0 if item == 0 else random.randint(0, item) for item in crop_margin]
- crop_max = [crop_min[i] + output_size[i] for i in range(input_dim)]
-
- label_exist = True if ('label' in sample and sample['label'].sum() > 0) else False
- if(label_exist and self.fg_focus and random.random() < self.fg_ratio):
- label = sample['label'][0]
- if(self.mask_label is None):
- mask_label = np.unique(label)[1:]
- else:
- mask_label = self.mask_label
- random_label = random.choice(mask_label)
- crop_min, crop_max = get_random_box_from_mask(label == random_label, output_size, mode = 1)
-
- crop_min = [0] + crop_min
- crop_max = [chns] + crop_max
-
- sample['RandomCrop_Param'] = json.dumps((image.shape, crop_min, crop_max))
- return sample, crop_min, crop_max
-
- def _get_param_for_inverse_transform(self, sample):
- if(isinstance(sample['RandomCrop_Param'], list) or \
- isinstance(sample['RandomCrop_Param'], tuple)):
- params = json.loads(sample['RandomCrop_Param'][0])
- else:
- params = json.loads(sample['RandomCrop_Param'])
- return params
-
-class RandomResizedCrop(CenterCrop):
- """
- Randomly resize and crop the input image (shape [C, D, H, W]).
- The arguments should be written in the `params` dictionary, and it has the
- following fields:
-
- :param `RandomResizedCrop_output_size`: (list/tuple) Desired output size [D, H, W].
- The output channel is the same as the input channel.
- :param `RandomResizedCrop_scale_lower_bound`: (list/tuple) Lower bound of the range of scale
- for each dimension. e.g. (1.0, 0.5, 0.5).
- param `RandomResizedCrop_scale_upper_bound`: (list/tuple) Upper bound of the range of scale
- for each dimension. e.g. (1.0, 2.0, 2.0).
- :param `RandomResizedCrop_inverse`: (optional, bool) Is inverse transform needed for inference.
- Default is `False`. Currently, the inverse transform is not supported, and
- this transform is assumed to be used only during training stage.
- """
- def __init__(self, params):
- self.output_size = params['RandomResizedCrop_output_size'.lower()]
- self.scale_lower = params['RandomResizedCrop_resize_lower_bound'.lower()]
- self.scale_upper = params['RandomResizedCrop_resize_upper_bound'.lower()]
- self.prob = params.get('RandomResizedCrop_resize_prob'.lower(), 0.5)
- self.fg_ratio = params.get('RandomResizedCrop_foreground_ratio'.lower(), 0.0)
- self.mask_label = params.get('RandomResizedCrop_mask_label'.lower(), None)
- self.inverse = params.get('RandomResizedCrop_inverse'.lower(), False)
- self.task = params['Task'.lower()]
- assert isinstance(self.output_size, (list, tuple))
- assert isinstance(self.scale_lower, (list, tuple))
- assert isinstance(self.scale_upper, (list, tuple))
-
- def __call__(self, sample):
- image = sample['image']
- channel, input_size = image.shape[0], image.shape[1:]
- input_dim = len(input_size)
- assert(input_dim == len(self.output_size))
-
- # get the resized crop size
- resize = random.random() < self.prob
- if(resize):
- scale = [self.scale_lower[i] + (self.scale_upper[i] - self.scale_lower[i]) * random.random() \
- for i in range(input_dim)]
- crop_size = [int(self.output_size[i] * scale[i]) for i in range(input_dim)]
- else:
- crop_size = self.output_size
-
- crop_margin = [input_size[i] - crop_size[i] for i in range(input_dim)]
- pad_image = min(crop_margin) < 0
- if(pad_image): # pad the image if necessary
- pad_size = [max(0, -crop_margin[i]) for i in range(input_dim)]
- pad_lower = [int(pad_size[i] / 2) for i in range(input_dim)]
- pad_upper = [pad_size[i] - pad_lower[i] for i in range(input_dim)]
- pad = [(pad_lower[i], pad_upper[i]) for i in range(input_dim)]
- pad = tuple([(0, 0)] + pad)
- image = np.pad(image, pad, 'reflect')
- crop_margin = [max(0, crop_margin[i]) for i in range(input_dim)]
- # ge the bounding box for crop
- if(random.random() < self.fg_ratio):
- label = sample['label']
- if(pad_image):
- label = np.pad(label, pad, 'reflect')
- label = label[0]
- if(self.mask_label is None):
- mask_label = np.unique(label)[1:]
- else:
- mask_label = self.mask_label
- random_label = random.choice(mask_label)
- crop_min, crop_max = get_random_box_from_mask(label == random_label, crop_size, mode = 1)
- else:
- crop_min = [random.randint(0, item) for item in crop_margin]
- crop_max = [crop_min[i] + crop_size[i] for i in range(input_dim)]
- crop_min = [0] + crop_min
- crop_max = [channel] + crop_max
-
- image_t = crop_ND_volume_with_bounding_box(image, crop_min, crop_max)
- if(resize):
- scale = [(self.output_size[i] + 0.0)/crop_size[i] for i in range(input_dim)]
- scale = [1.0] + scale
- image_t = ndimage.interpolation.zoom(image_t, scale, order = 1)
- sample['image'] = image_t
-
- if('label' in sample and \
- self.task in [TaskType.SEGMENTATION, TaskType.RECONSTRUCTION]):
- label = sample['label']
- if(pad_image):
- label = np.pad(label, pad, 'reflect')
- crop_max[0] = label.shape[0]
- label = crop_ND_volume_with_bounding_box(label, crop_min, crop_max)
- if(resize):
- order = 0 if(self.task == TaskType.SEGMENTATION) else 1
- label = ndimage.interpolation.zoom(label, scale, order = order)
- sample['label'] = label
- if('pixel_weight' in sample and \
- self.task in [TaskType.SEGMENTATION, TaskType.RECONSTRUCTION]):
- weight = sample['pixel_weight']
- if(pad_image):
- weight = np.pad(weight, pad, 'reflect')
- crop_max[0] = weight.shape[0]
- weight = crop_ND_volume_with_bounding_box(weight, crop_min, crop_max)
- if(resize):
- weight = ndimage.interpolation.zoom(weight, scale, order = 1)
- sample['pixel_weight'] = weight
- return sample
-
-class RandomSlice(AbstractTransform):
- """Randomly selecting N slices from a volume
-
- The arguments should be written in the `params` dictionary, and it has the
- following fields:
-
- :param `RandomSlice_output_size`: (int) Desired number of slice for output.
- :param `RandomSlice_inverse`: (optional, bool) Is inverse transform needed for inference.
- Default is `True`.
- """
- def __init__(self, params):
- self.output_size = params['RandomSlice_output_size'.lower()]
- self.fg_focus = params.get('RandomSlice_foreground_focus'.lower(), False)
- self.fg_ratio = params.get('RandomSlice_foreground_ratio'.lower(), 0.5)
- self.mask_label = params.get('RandomSlice_mask_label'.lower(), None)
- self.shuffle = params.get('RandomSlice_shuffle'.lower(), False)
- self.inverse = params.get('RandomSlice_inverse'.lower(), False)
- self.task = params['Task'.lower()]
-
- def __call__(self, sample):
- image = sample['image']
- D = image.shape[1]
- assert( D >= self.output_size)
- out_half = self.output_size // 2
-
- label_exist = True if ('label' in sample and sample['label'].sum() > 0) else False
- if(label_exist and self.fg_focus and random.random() < self.fg_ratio):
- label = sample['label'][0]
- if(self.mask_label is None):
- mask_label = np.unique(label)[1:]
- else:
- mask_label = self.mask_label
- random_label = random.choice(mask_label)
- mask = label == random_label
- dc = random.choice(np.nonzero(mask)[0])
- else:
- dc = random.choice(range(out_half, D - out_half))
-
- slice_idx = list(range(D))
- if(self.shuffle):
- random.shuffle(slice_idx)
- d0 = random.randint(0, D - self.output_size)
- d1 = d0 + self.output_size
- slice_idx = slice_idx[d0:d1-1] + [dc]
- else:
- d0 = max(0, dc - out_half)
- d1 = d0 + self.output_size
- slice_idx = slice_idx[d0:d1]
- sample['image'] = image[:, slice_idx, :, :]
-
- if('label' in sample and \
- self.task in [TaskType.SEGMENTATION, TaskType.RECONSTRUCTION]):
- label = sample['label']
- sample['label'] = label[:, slice_idx, :, :]
-
- if('pixel_weight' in sample and \
- self.task in [TaskType.SEGMENTATION, TaskType.RECONSTRUCTION]):
- weight = sample['pixel_weight']
- sample['pixel_weight'] = weight[:, slice_idx, :, :]
-
- return sample
-
-class CropHumanRegion(CenterCrop):
- """
- Crop the human region from a CT for MRI volume.
- The arguments should be written in the `params` dictionary, and it has the
- following fields:
-
- :param `CropWithBoundingBox_start`: (None, or list/tuple) The start index
- along each spatial axis. If None, calculate the start index automatically
- so that the cropped region is centered at the mask region defined by the threshold.
- :param `CropWithBoundingBox_output_size`: (None or tuple/list):
- Desired spatial output size.
- If None, set it as the size of bounding box of the mask region defined by the threshold.
- :param `CropWithBoundingBox_threshold`: (None or float):
- Threshold for obtaining a mask. This is used only when
- `CropWithBoundingBox_start` is None. Default is 1.0
- :param `CropWithBoundingBox_inverse`: (optional, bool) Is inverse transform needed for inference.
- Default is `True`.
- """
- def __init__(self, params):
- self.threshold_i = params.get('CropHumanRegion_intensity_threshold'.lower(), -600)
- self.threshold_mode = params.get('CropHumanRegion_threshold_mode'.lower(), 'mean')
- self.threshold_z = params.get('CropHumanRegion_zaxis_threshold'.lower(), 0.5)
- self.inverse = params.get('CropHumanRegion_inverse'.lower(), True)
- self.task = params['task']
-
- def _get_crop_param(self, sample):
- image = sample['image']
- input_shape = image.shape
- mask = np.asarray(image[0] > self.threshold_i)
- if(self.threshold_mode == "mean"):
- mask2d = np.mean(mask, axis = 0) > self.threshold_z
- else:
- mask2d = np.max(mask, axis = 0)
- se = np.ones([3,3])
- mask2d = ndimage.binary_opening(mask2d, se, iterations = 2)
- if(mask2d.sum() > 0):
- mask2d = get_largest_k_components(mask2d, 1)
- bbmin, bbmax = get_ND_bounding_box(mask2d, margin = [0, 0])
- else:
- bbmin = [0] * (image.ndim - 2)
- bbmax = list(input_shape[2:])
- crop_min = [0, 0] + bbmin
- crop_max = list(input_shape[:2]) + bbmax
- sample['CropHumanRegion_Param'] = json.dumps((input_shape, crop_min, crop_max))
- return sample, crop_min, crop_max
-
- def _get_param_for_inverse_transform(self, sample):
- if(isinstance(sample['CropHumanRegion_Param'], list) or \
- isinstance(sample['CropHumanRegion_Param'], tuple)):
- params = json.loads(sample['CropHumanRegion_Param'][0])
- else:
- params = json.loads(sample['CropHumanRegion_Param'])
- return params
\ No newline at end of file
diff --git a/pymic/transform/crop4dino.py b/pymic/transform/crop4dino.py
deleted file mode 100644
index df86787..0000000
--- a/pymic/transform/crop4dino.py
+++ /dev/null
@@ -1,175 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-
-import torch
-import json
-import math
-import random
-import numpy as np
-from scipy import ndimage
-from pymic import TaskType
-from pymic.transform.abstract_transform import AbstractTransform
-from pymic.transform.crop import CenterCrop
-from pymic.transform.intensity import *
-from pymic.util.image_process import *
-
-class Crop4Dino(CenterCrop):
- """
- Randomly crop an volume into two views with augmentation. This is used for
- self-supervised pretraining such as DeSD.
-
- The arguments should be written in the `params` dictionary, and it has the
- following fields:
-
- :param `DualViewCrop_output_size`: (list/tuple) Desired output size [D, H, W].
- The output channel is the same as the input channel.
- :param `DualViewCrop_scale_lower_bound`: (list/tuple) Lower bound of the range of scale
- for each dimension. e.g. (1.0, 0.5, 0.5).
- param `DualViewCrop_scale_upper_bound`: (list/tuple) Upper bound of the range of scale
- for each dimension. e.g. (1.0, 2.0, 2.0).
- :param `DualViewCrop_inverse`: (optional, bool) Is inverse transform needed for inference.
- Default is `False`. Currently, the inverse transform is not supported, and
- this transform is assumed to be used only during training stage.
- """
- def __init__(self, params):
- self.output_size = params['Crop4Dino_output_size'.lower()]
- self.scale_lower = params['Crop4Dino_resize_lower_bound'.lower()]
- self.scale_upper = params['Crop4Dino_resize_upper_bound'.lower()]
- self.prob = params.get('Crop4Dino_resize_prob'.lower(), 0.5)
- self.noise_std_range = params.get('Crop4Dino_noise_std_range'.lower(), (0.05, 0.1))
- self.blur_sigma_range = params.get('Crop4Dino_blur_sigma_range'.lower(), (1.0, 3.0))
- self.gamma_range = params.get('Crop4Dino_gamma_range'.lower(), (0.75, 1.25))
- self.inverse = params.get('Crop4Dino_inverse'.lower(), False)
- self.task = params['Task'.lower()]
- assert isinstance(self.output_size, (list, tuple))
- assert isinstance(self.scale_lower, (list, tuple))
- assert isinstance(self.scale_upper, (list, tuple))
-
- def __call__(self, sample):
- image = sample['image']
- channel, input_size = image.shape[0], image.shape[1:]
- input_dim = len(input_size)
- assert(input_dim == len(self.output_size))
-
- # # center crop first
- # crop_size = self.output_size
- # crop_margin = [input_size[i] - crop_size[i] for i in range(input_dim)]
- # crop_min = [int(item/2) for item in crop_margin]
- # crop_max = [crop_min[i] + crop_size[i] for i in range(input_dim)]
- # crop_min = [0] + crop_min
- # crop_max = [channel] + crop_max
- # crop0 = crop_ND_volume_with_bounding_box(image, crop_min, crop_max)
-
- crop_num = 2
- crop_img = []
- for crop_i in range(crop_num):
- resize = random.random() < self.prob
- if(resize):
- scale = [self.scale_lower[i] + (self.scale_upper[i] - self.scale_lower[i]) * random.random() \
- for i in range(input_dim)]
- crop_size = [int(self.output_size[i] * scale[i]) for i in range(input_dim)]
- else:
- crop_size = self.output_size
-
- crop_margin = [input_size[i] - crop_size[i] for i in range(input_dim)]
- pad_image = min(crop_margin) < 0
- if(pad_image): # pad the image if necessary
- pad_size = [max(0, -crop_margin[i]) for i in range(input_dim)]
- pad_lower = [int(pad_size[i] / 2) for i in range(input_dim)]
- pad_upper = [pad_size[i] - pad_lower[i] for i in range(input_dim)]
- pad = [(pad_lower[i], pad_upper[i]) for i in range(input_dim)]
- pad = tuple([(0, 0)] + pad)
- image = np.pad(image, pad, 'reflect')
- crop_margin = [max(0, crop_margin[i]) for i in range(input_dim)]
-
-
- crop_min = [random.randint(0, item) for item in crop_margin]
- crop_max = [crop_min[i] + crop_size[i] for i in range(input_dim)]
- crop_min = [0] + crop_min
- crop_max = [channel] + crop_max
-
- crop_out = crop_ND_volume_with_bounding_box(image, crop_min, crop_max)
- if(resize):
- scale = [(self.output_size[i] + 0.0)/crop_size[i] for i in range(input_dim)]
- scale = [1.0] + scale
- crop_out = ndimage.interpolation.zoom(crop_out, scale, order = 1)
-
- # add intensity augmentation
- C = crop_out.shape[0]
- for c in range(C):
- if(random.random() < 0.8):
- crop_out[c] = gaussian_noise(crop_out[c], self.noise_std_range[0], self.noise_std_range[1])
-
- if(random.uniform(0, 1) < 0.5):
- crop_out[c] = gaussian_blur(crop_out[c], self.blur_sigma_range[0], self.blur_sigma_range[1])
- else:
- alpha = random.uniform(0.0, 2.0)
- crop_out[c] = gaussian_sharpen(crop_out[c], self.blur_sigma_range[0], self.blur_sigma_range[1], alpha)
- if(random.random() < 0.8):
- crop_out[c] = gamma_correction(crop_out[c], self.gamma_range[0], self.gamma_range[1])
- if(random.random() < 0.8):
- crop_out[c] = window_level_augment(crop_out[c])
- crop_img.append(crop_out)
- sample['image'] = crop_img
- return sample
-
- def __call__backup(self, sample):
- image = sample['image']
- channel, input_size = image.shape[0], image.shape[1:]
- input_dim = len(input_size)
- assert(input_dim == len(self.output_size))
-
- # center crop first
- crop_size = self.output_size
- crop_margin = [input_size[i] - crop_size[i] for i in range(input_dim)]
- crop_min = [int(item/2) for item in crop_margin]
- crop_max = [crop_min[i] + crop_size[i] for i in range(input_dim)]
- crop_min = [0] + crop_min
- crop_max = [channel] + crop_max
- crop0 = crop_ND_volume_with_bounding_box(image, crop_min, crop_max)
-
- # crop_num = 2
- # crop_img = []
- # for crop_i in range(crop_num):
- # get another resized crop size
- resize = random.random() < self.prob
- if(resize):
- scale = [self.scale_lower[i] + (self.scale_upper[i] - self.scale_lower[i]) * random.random() \
- for i in range(input_dim)]
- crop_size = [int(self.output_size[i] * scale[i]) for i in range(input_dim)]
- else:
- crop_size = self.output_size
-
- crop_margin = [input_size[i] - crop_size[i] for i in range(input_dim)]
- pad_image = min(crop_margin) < 0
- if(pad_image): # pad the image if necessary
- pad_size = [max(0, -crop_margin[i]) for i in range(input_dim)]
- pad_lower = [int(pad_size[i] / 2) for i in range(input_dim)]
- pad_upper = [pad_size[i] - pad_lower[i] for i in range(input_dim)]
- pad = [(pad_lower[i], pad_upper[i]) for i in range(input_dim)]
- pad = tuple([(0, 0)] + pad)
- image = np.pad(image, pad, 'reflect')
- crop_margin = [max(0, crop_margin[i]) for i in range(input_dim)]
-
-
- crop_min = [random.randint(0, item) for item in crop_margin]
- crop_max = [crop_min[i] + crop_size[i] for i in range(input_dim)]
- crop_min = [0] + crop_min
- crop_max = [channel] + crop_max
-
- crop_out = crop_ND_volume_with_bounding_box(image, crop_min, crop_max)
- if(resize):
- scale = [(self.output_size[i] + 0.0)/crop_size[i] for i in range(input_dim)]
- scale = [1.0] + scale
- crop_out = ndimage.interpolation.zoom(crop_out, scale, order = 1)
- # crop_img.append(crop_out)
- crop_img = [crop0, crop_out]
- # add intensity augmentation
- # image_t = gaussian_noise(image_t, self.noise_std_range[0], self.noise_std_range[1], 0.8)
- # image_t = gaussian_blur(image_t, self.blur_sigma_range[0], self.blur_sigma_range[1], 0.8)
- # image_t = brightness_multiplicative(image_t, self.inten_multi_range[0], self.inten_multi_range[1], 0.8)
- # image_t = brightness_additive(image_t, self.inten_add_range[0], self.inten_add_range[1], 0.8)
- # image_t = contrast_augment(image_t, self.contrast_f_range[0], self.contrast_f_range[1], 0.8)
- # image_t = gamma_correction(image_t, self.gamma_range[0], self.gamma_range[1], 0.8)
- sample['image'] = crop_img
- return sample
diff --git a/pymic/transform/crop4vf.py b/pymic/transform/crop4vf.py
deleted file mode 100644
index 4e07357..0000000
--- a/pymic/transform/crop4vf.py
+++ /dev/null
@@ -1,232 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-
-import torch
-
-import json
-import math
-import random
-import numpy as np
-from imops import crop_to_box
-from typing import *
-from scipy import ndimage
-from pymic import TaskType
-from pymic.transform.abstract_transform import AbstractTransform
-from pymic.transform.crop import CenterCrop
-from pymic.util.image_process import *
-from pymic.transform.intensity import *
-
-
-def random_resized_crop(image, output_size, scale_lower, scale_upper):
- input_size = image.shape
- scale = [scale_lower[i] + (scale_upper[i] - scale_lower[i]) * random.random() \
- for i in range(3)]
- crop_size = [min(int(output_size[i] * scale[i]), input_size[1+i]) for i in range(3)]
- crop_margin = [input_size[1+i] - crop_size[i] for i in range(3)]
- crop_min = [random.randint(0, item) for item in crop_margin]
- crop_max = [crop_min[i] + crop_size[i] for i in range(3)]
- crop_min = [0] + crop_min
- crop_max = [input_size[0]] + crop_max
-
- image_t = crop_ND_volume_with_bounding_box(image, crop_min, crop_max)
- scale = [(output_size[i] + 0.0)/crop_size[i] for i in range(3)]
- scale = [1.0] + scale
- image_t = ndimage.interpolation.zoom(image_t, scale, order = 1)
- return image_t
-
-def random_flip(image):
- flip_axis = []
- if(random.random() > 0.5):
- flip_axis.append(-1)
- if(random.random() > 0.5):
- flip_axis.append(-2)
- if(random.random() > 0.5):
- flip_axis.append(-3)
- if(len(flip_axis) > 0):
- image = np.flip(image , flip_axis)
- return image
-
-
-class Crop4VolumeFusion(AbstractTransform):
- """
- Randomly crop an volume into two views with augmentation. This is used for
- self-supervised pretraining in Vox2vec.
-
- The arguments should be written in the `params` dictionary, and it has the
- following fields:
-
- :param `Crop4VolumeFusion_output_size`: (list/tuple) Desired output size [D, H, W].
- The output channel is the same as the input channel.
- :param `Crop4VolumeFusion_rescale_lower_bound`: (list/tuple) Lower bound of the range of scale
- for each dimension. e.g. (1.0, 0.5, 0.5).
- param `Crop4VolumeFusion_rescale_upper_bound`: (list/tuple) Upper bound of the range of scale
- for each dimension. e.g. (1.0, 2.0, 2.0).
- :param `Crop4VolumeFusion_augentation_mode`: (optional, int) The mode for augmentation of cropped volume.
- 0: no spatial or intensity augmentatin.
- 1: intensity augmentation only
-` 2: spatial augmentation only
- 3: Both intensity and spatial augmentation (default).
- """
- def __init__(self, params):
- self.output_size = params['Crop4VolumeFusion_output_size'.lower()]
- self.scale_lower = params.get('Crop4VolumeFusion_rescale_lower_bound'.lower(), [0.7, 0.7, 0.7])
- self.scale_upper = params.get('Crop4VolumeFusion_rescale_upper_bound'.lower(), [1.5, 1.5, 1.5])
- self.aug_mode = params.get('Crop4VolumeFusion_augentation_mode'.lower(), 3)
- self.task = params['Task'.lower()]
- assert isinstance(self.output_size, (list, tuple))
-
- def __call__(self, sample):
- image = sample['image']
- channel, input_size = image.shape[0], image.shape[1:]
- input_dim = len(input_size)
- assert channel == 1
- assert(input_dim == len(self.output_size))
-
- if(self.aug_mode == 0 or self.aug_mode == 1):
- self.scale_lower = [1.0, 1.0, 1.0]
- self.scale_upper = [1.0, 1.0, 1.0]
- patch_1 = random_resized_crop(image, self.output_size, self.scale_lower, self.scale_upper)
- patch_2 = random_resized_crop(image, self.output_size, self.scale_lower, self.scale_upper)
- if(self.aug_mode > 1):
- patch_1 = random_flip(patch_1)
- patch_2 = random_flip(patch_2)
- if(self.aug_mode == 1 or self.aug_mode == 3):
- p0, p1 = random.uniform(0.1, 2.0), random.uniform(98, 99.9)
- patch_1 = adaptive_contrast_adjust(patch_1, p0, p1)
- patch_1 = gamma_correction(patch_1, 0.7, 1.5)
-
- p0, p1 = random.uniform(0.1, 2.0), random.uniform(98, 99.9)
- patch_2 = adaptive_contrast_adjust(patch_2, p0, p1)
- patch_2 = gamma_correction(patch_2, 0.7, 1.5)
-
- if(random.random() < 0.25):
- patch_1 = 1.0 - patch_1
- patch_2 = 1.0 - patch_2
-
- sample['image'] = patch_1, patch_2
- return sample
-
-class VolumeFusion(AbstractTransform):
- """
- Randomly crop an volume into two views with augmentation. This is used for
- self-supervised pretraining in Vox2vec.
-
- The arguments should be written in the `params` dictionary, and it has the
- following fields:
-
- :param `DualViewCrop_output_size`: (list/tuple) Desired output size [D, H, W].
- The output channel is the same as the input channel.
- :param `DualViewCrop_scale_lower_bound`: (list/tuple) Lower bound of the range of scale
- for each dimension. e.g. (1.0, 0.5, 0.5).
- param `DualViewCrop_scale_upper_bound`: (list/tuple) Upper bound of the range of scale
- for each dimension. e.g. (1.0, 2.0, 2.0).
- :param `DualViewCrop_inverse`: (optional, bool) Is inverse transform needed for inference.
- Default is `False`. Currently, the inverse transform is not supported, and
- this transform is assumed to be used only during training stage.
- """
- def __init__(self, params):
- self.cls_num = params.get('VolumeFusion_cls_num'.lower(), 5)
- self.ratio = params.get('VolumeFusion_foreground_ratio'.lower(), 0.7)
- self.size_min = params.get('VolumeFusion_patchsize_min'.lower(), [8, 8, 8])
- self.size_max = params.get('VolumeFusion_patchsize_max'.lower(), [32, 32, 32])
- self.task = params['Task'.lower()]
-
- def __call__(self, sample):
- K = self.cls_num - 1
- image1, image2 = sample['image']
- C, D, H, W = image1.shape
- db = random.randint(self.size_min[0], self.size_max[0])
- hb = random.randint(self.size_min[1], self.size_max[1])
- wb = random.randint(self.size_min[2], self.size_max[2])
- d_offset = random.randint(0, D % db)
- h_offset = random.randint(0, H % hb)
- w_offset = random.randint(0, W % wb)
- d_n = D // db
- h_n = H // hb
- w_n = W // wb
- Nblock = d_n * h_n * w_n
- Nfg = int(d_n * h_n * w_n * self.ratio)
- list_fg = [1] * Nfg + [0] * (Nblock - Nfg)
- random.shuffle(list_fg)
- mask = np.zeros([1, D, H, W], np.uint8)
- for d in range(d_n):
- for h in range(h_n):
- for w in range(w_n):
- d0, h0, w0 = d*db + d_offset, h*hb + h_offset, w*wb + w_offset
- d1, h1, w1 = d0 + db, h0 + hb, w0 + wb
- idx = d*h_n*w_n + h*w_n + w
- if(list_fg[idx]> 0):
- cls_k = random.randint(1, K)
- mask[:, d0:d1, h0:h1, w0:w1] = cls_k
- alpha = mask * 1.0 / K
- x_fuse = alpha*image1 + (1.0 - alpha)*image2
- sample['image'] = x_fuse
- sample['label'] = mask
- return sample
-
-class VolumeFusionShuffle(AbstractTransform):
- """
- Randomly crop an volume into two views with augmentation. This is used for
- self-supervised pretraining in Vox2vec.
-
- The arguments should be written in the `params` dictionary, and it has the
- following fields:
-
- :param `DualViewCrop_output_size`: (list/tuple) Desired output size [D, H, W].
- The output channel is the same as the input channel.
- :param `DualViewCrop_scale_lower_bound`: (list/tuple) Lower bound of the range of scale
- for each dimension. e.g. (1.0, 0.5, 0.5).
- param `DualViewCrop_scale_upper_bound`: (list/tuple) Upper bound of the range of scale
- for each dimension. e.g. (1.0, 2.0, 2.0).
- :param `DualViewCrop_inverse`: (optional, bool) Is inverse transform needed for inference.
- Default is `False`. Currently, the inverse transform is not supported, and
- this transform is assumed to be used only during training stage.
- """
- def __init__(self, params):
- self.cls_num = params.get('VolumeFusionShuffle_cls_num'.lower(), 5)
- self.ratio = params.get('VolumeFusionShuffle_foreground_ratio'.lower(), 0.7)
- self.size_min = params.get('VolumeFusionShuffle_patchsize_min'.lower(), [8, 8, 8])
- self.size_max = params.get('VolumeFusionShuffle_patchsize_max'.lower(), [32, 32, 32])
- self.task = params['Task'.lower()]
-
- def __call__(self, sample):
- K = self.cls_num - 1
- image1, image2 = sample['image']
- C, D, H, W = image1.shape
- x_fuse = image2 * 1.0
- mask = np.zeros([1, D, H, W], np.uint8)
- db = random.randint(self.size_min[0], self.size_max[0])
- hb = random.randint(self.size_min[1], self.size_max[1])
- wb = random.randint(self.size_min[2], self.size_max[2])
- d_offset = random.randint(0, D % db)
- h_offset = random.randint(0, H % hb)
- w_offset = random.randint(0, W % wb)
- d_n = D // db
- h_n = H // hb
- w_n = W // wb
- coord_list_source = []
- for di in range(d_n):
- for hi in range(h_n):
- for wi in range(w_n):
- coord_list_source.append([di, hi, wi])
- coord_list_target = copy.deepcopy(coord_list_source)
- random.shuffle(coord_list_source)
- random.shuffle(coord_list_target)
- for i in range(int(len(coord_list_source)*self.ratio)):
- ds_l = d_offset + db * coord_list_source[i][0]
- hs_l = h_offset + hb * coord_list_source[i][1]
- ws_l = w_offset + wb * coord_list_source[i][2]
- dt_l = d_offset + db * coord_list_target[i][0]
- ht_l = h_offset + hb * coord_list_target[i][1]
- wt_l = w_offset + wb * coord_list_target[i][2]
- s_crop = image1[:, ds_l:ds_l+db, hs_l:hs_l+hb, ws_l:ws_l+wb]
- t_crop = image2[:, dt_l:dt_l+db, ht_l:ht_l+hb, wt_l:wt_l+wb]
- fg_m = random.randint(1, K)
- fg_w = fg_m / (K + 0.0)
- x_fuse[:, dt_l:dt_l+db, ht_l:ht_l+hb, wt_l:wt_l+wb] = t_crop * (1.0 - fg_w) + s_crop * fg_w
- mask[0, dt_l:dt_l+db, ht_l:ht_l+hb, wt_l:wt_l+wb] = \
- np.ones([1, db, hb, wb]) * fg_m
- sample['image'] = x_fuse
- sample['label'] = mask
- return sample
-
diff --git a/pymic/transform/crop4voco.py b/pymic/transform/crop4voco.py
deleted file mode 100644
index 6c52ca7..0000000
--- a/pymic/transform/crop4voco.py
+++ /dev/null
@@ -1,107 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-
-import torch
-import json
-import math
-import random
-import numpy as np
-from scipy import ndimage
-from pymic import TaskType
-from pymic.transform.abstract_transform import AbstractTransform
-from pymic.transform.crop import CenterCrop
-from pymic.transform.intensity import *
-from pymic.util.image_process import *
-
-def get_position_label(roi=96, num_crops=4):
- half = roi // 2
- max_roi = roi * num_crops
- center_x, center_y = np.random.randint(low=half, high=max_roi - half), \
- np.random.randint(low=half, high=max_roi - half)
-
- x_min, x_max = center_x - half, center_x + half
- y_min, y_max = center_y - half, center_y + half
-
- total_area = roi * roi
- labels = []
- for j in range(num_crops):
- for i in range(num_crops):
- crop_x_min, crop_x_max = i * roi, (i + 1) * roi
- crop_y_min, crop_y_max = j * roi, (j + 1) * roi
-
- dx = min(crop_x_max, x_max) - max(crop_x_min, x_min)
- dy = min(crop_y_max, y_max) - max(crop_y_min, y_min)
- if dx <= 0 or dy <= 0:
- area = 0
- else:
- area = (dx * dy) / total_area
- labels.append(area)
-
- labels = np.asarray(labels).reshape(1, num_crops * num_crops)
- return x_min, y_min, labels
-
-class Crop4VoCo(CenterCrop):
- """
- Randomly crop an volume into two views with augmentation. This is used for
- self-supervised pretraining such as DeSD.
-
- The arguments should be written in the `params` dictionary, and it has the
- following fields:
-
- :param `DualViewCrop_output_size`: (list/tuple) Desired output size [D, H, W].
- The output channel is the same as the input channel.
- :param `DualViewCrop_scale_lower_bound`: (list/tuple) Lower bound of the range of scale
- for each dimension. e.g. (1.0, 0.5, 0.5).
- param `DualViewCrop_scale_upper_bound`: (list/tuple) Upper bound of the range of scale
- for each dimension. e.g. (1.0, 2.0, 2.0).
- :param `DualViewCrop_inverse`: (optional, bool) Is inverse transform needed for inference.
- Default is `False`. Currently, the inverse transform is not supported, and
- this transform is assumed to be used only during training stage.
- """
- def __init__(self, params):
- roi_size = params.get('Crop4VoCo_roi_size'.lower(), 64)
- if isinstance(roi_size, int):
- self.roi_size = [roi_size] * 3
- else:
- self.roi_size = roi_size
- self.roi_num = params.get('Crop4VoCo_roi_num'.lower(), 2)
- self.base_num = params.get('Crop4VoCo_base_num'.lower(), 4)
-
- self.inverse = params.get('Crop4VoCo_inverse'.lower(), False)
- self.task = params['Task'.lower()]
-
- def __call__(self, sample):
- image = sample['image']
- channel, input_size = image.shape[0], image.shape[1:]
- input_dim = len(input_size)
- # print(input_size, self.roi_size)
- assert(input_size[0] == self.roi_size[0])
- assert(input_size[1] == self.roi_size[1] * self.base_num)
- assert(input_size[2] == self.roi_size[2] * self.base_num)
-
- base_num, roi_num, roi_size = self.base_num, self.roi_num, self.roi_size
- base_crops, roi_crops, roi_labels = [], [], []
- crop_size = [channel] + list(roi_size)
- for j in range(base_num):
- for i in range(base_num):
- crop_min = [0, 0, roi_size[1]*j, roi_size[2]*i]
- crop_max = [crop_min[d] + crop_size[d] for d in range(4)]
- crop_out = crop_ND_volume_with_bounding_box(image, crop_min, crop_max)
- base_crops.append(crop_out)
-
- for i in range(roi_num):
- x_min, y_min, label = get_position_label(self.roi_size[2], base_num)
- # print('label', label)
- crop_min = [0, 0, y_min, x_min]
- crop_max = [crop_min[d] + crop_size[d] for d in range(4)]
- crop_out = crop_ND_volume_with_bounding_box(image, crop_min, crop_max)
- roi_crops.append(crop_out)
- roi_labels.append(label)
- roi_labels = np.concatenate(roi_labels, 0).reshape(roi_num, base_num * base_num)
-
- base_crops = np.stack(base_crops, 0)
- roi_crops = np.stack(roi_crops, 0)
- sample['image'] = base_crops, roi_crops, roi_labels
- return sample
-
-
\ No newline at end of file
diff --git a/pymic/transform/crop4vox2vec.py b/pymic/transform/crop4vox2vec.py
deleted file mode 100644
index 6fdcf83..0000000
--- a/pymic/transform/crop4vox2vec.py
+++ /dev/null
@@ -1,160 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-
-import torch
-
-import json
-import math
-import random
-import numpy as np
-from imops import crop_to_box
-from typing import *
-from scipy import ndimage
-from pymic import TaskType
-from pymic.transform.abstract_transform import AbstractTransform
-from pymic.transform.crop import CenterCrop
-from pymic.util.image_process import *
-from pymic.transform.intensity import *
-
-def normalize_axis_list(axis, ndim):
- return list(np.core.numeric.normalize_axis_tuple(axis, ndim))
-
-def scale_hu(image_hu: np.ndarray, window_hu: Tuple[float, float]) -> np.ndarray:
- min_hu, max_hu = window_hu
- assert min_hu < max_hu
- return np.clip((image_hu - min_hu) / (max_hu - min_hu), 0, 1)
-
-# def gaussian_filter(
-# x: np.ndarray,
-# sigma: Union[float, Sequence[float]],
-# axis: Union[int, Sequence[int]]
-# ) -> np.ndarray:
-# axis = normalize_axis_list(axis, x.ndim)
-# sigma = np.broadcast_to(sigma, len(axis))
-# for sgm, ax in zip(sigma, axis):
-# x = ndimage.gaussian_filter1d(x, sgm, ax)
-# return x
-
-# def gaussian_sharpen(
-# x: np.ndarray,
-# sigma_1: Union[float, Sequence[float]],
-# sigma_2: Union[float, Sequence[float]],
-# alpha: float,
-# axis: Union[int, Sequence[int]]
-# ) -> np.ndarray:
-# """ See https://docs.monai.io/en/stable/transforms.html#gaussiansharpen """
-# blurred = gaussian_filter(x, sigma_1, axis)
-# return blurred + alpha * (blurred - gaussian_filter(blurred, sigma_2, axis))
-
-def sample_box(image_size, patch_size, anchor_voxel=None):
- image_size = np.array(image_size, ndmin=1)
- patch_size = np.array(patch_size, ndmin=1)
-
- if not np.all(image_size >= patch_size):
- raise ValueError(f'Can\'t sample patch of size {patch_size} from image of size {image_size}')
-
- min_start = 0
- max_start = image_size - patch_size
- if anchor_voxel is not None:
- anchor_voxel = np.array(anchor_voxel, ndmin=1)
- min_start = np.maximum(min_start, anchor_voxel - patch_size + 1)
- max_start = np.minimum(max_start, anchor_voxel)
- start = np.random.randint(min_start, max_start + 1)
- return np.array([start, start + patch_size])
-
-def sample_views(
- image: np.ndarray,
- min_overlap: Tuple[int, int, int],
- patch_size: Tuple[int, int, int],
- max_num_voxels: int,
-) -> Tuple[np.ndarray, np.ndarray, np.ndarray, np.ndarray, np.ndarray]:
- """ For 3D volumes, the image shape should be [C, D, H, W].
- """
- img_size = image.shape[1:]
- overlap = [random.randint(min_overlap[i], patch_size[i]) for i in range(3)]
- union_size = [2*patch_size[i] - overlap[i] for i in range(3)]
- anchor_max = [img_size[i] - union_size[i] for i in range(3)]
- crop_min_1 = [random.randint(0, anchor_max[i]) for i in range(3)]
- crop_min_2 = [crop_min_1[i] + patch_size[i] - overlap[i] for i in range(3)]
- patch_1 = sample_view(image, crop_min_1, patch_size)
- patch_2 = sample_view(image, crop_min_2, patch_size)
-
- coords = [range(crop_min_2[i], crop_min_2[i] + overlap[i]) for i in range(3)]
- coords = np.asarray(np.meshgrid(coords[0], coords[1], coords[2]))
- coords = coords.reshape(3, -1).transpose()
- roi_voxels_1 = coords - crop_min_1
- roi_voxels_2 = coords - crop_min_2
-
- indices = range(coords.shape[0])
- if len(indices) > max_num_voxels:
- indices = np.random.choice(indices, max_num_voxels, replace=False)
-
- return patch_1, patch_2, roi_voxels_1[indices], roi_voxels_2[indices]
-
-
-def sample_view(image, crop_min, patch_size):
- """ For 3D volumes, the image shape should be [C, D, H, W].
- """
- assert image.ndim == 4
- C = image.shape[0]
- crop_max = [crop_min[i] + patch_size[i] for i in range(3)]
- out = crop_ND_volume_with_bounding_box(image, [0] + crop_min, [C] + crop_max)
-
- # intensity augmentations
- for c in range(C):
- if(random.random() < 0.8):
- out[c] = gaussian_noise(out[c], 0.05, 0.1)
- if(random.random() < 0.5):
- out[c] = gaussian_blur(out[c], 0.5, 1.5)
- else:
- alpha = random.uniform(0.0, 2.0)
- out[c] = gaussian_sharpen(out[c], 0.5, 2.0, alpha)
- if(random.random() < 0.8):
- out[c] = gamma_correction(out[c], 0.5, 2.0)
- if(random.random() < 0.8):
- out[c] = window_level_augment(out[c])
- return out
-
-class Crop4Vox2Vec(CenterCrop):
- """
- Randomly crop an volume into two views with augmentation. This is used for
- self-supervised pretraining in Vox2vec.
-
- The arguments should be written in the `params` dictionary, and it has the
- following fields:
-
- :param `DualViewCrop_output_size`: (list/tuple) Desired output size [D, H, W].
- The output channel is the same as the input channel.
- :param `DualViewCrop_scale_lower_bound`: (list/tuple) Lower bound of the range of scale
- for each dimension. e.g. (1.0, 0.5, 0.5).
- param `DualViewCrop_scale_upper_bound`: (list/tuple) Upper bound of the range of scale
- for each dimension. e.g. (1.0, 2.0, 2.0).
- :param `DualViewCrop_inverse`: (optional, bool) Is inverse transform needed for inference.
- Default is `False`. Currently, the inverse transform is not supported, and
- this transform is assumed to be used only during training stage.
- """
- def __init__(self, params):
- self.output_size = params['Crop4Vox2Vec_output_size'.lower()]
- self.min_overlap = params.get('Crop4Vox2Vec_min_overlap'.lower(), [8, 12, 12])
- self.max_voxel = params.get('Crop4Vox2Vec_max_voxel'.lower(), 1024)
- self.inverse = params.get('Crop4Vox2Vec_inverse'.lower(), False)
- self.task = params['Task'.lower()]
- assert isinstance(self.output_size, (list, tuple))
-
- def __call__(self, sample):
- image = sample['image']
- channel, input_size = image.shape[0], image.shape[1:]
- input_dim = len(input_size)
- assert channel == 1
- assert(input_dim == len(self.output_size))
- invalid_size = [input_size[i] < self.output_size[i]*2 - self.min_overlap[i] for i in range(3)]
- if True in invalid_size:
- raise ValueError("The overlap requirement {0:} is too weak for the given patch size \
- {1:} and input size {2:}".format( self.min_overlap, self.output_size,input_size))
-
- patches_1, patches_2, voxels_1, voxels_2 = sample_views(image,
- self.min_overlap, self.output_size, self.max_voxel)
- sample['image'] = patches_1, patches_2, voxels_1, voxels_2
- return sample
-
-
diff --git a/pymic/transform/crop4voxMMSD.py b/pymic/transform/crop4voxMMSD.py
deleted file mode 100644
index 757d307..0000000
--- a/pymic/transform/crop4voxMMSD.py
+++ /dev/null
@@ -1,119 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-
-import torch
-
-import json
-import math
-import random
-import numpy as np
-from imops import crop_to_box
-from typing import *
-from scipy import ndimage
-from pymic import TaskType
-from pymic.transform.crop4vox2vec import sample_views
-from pymic.transform.abstract_transform import AbstractTransform
-from pymic.transform.crop import CenterCrop
-from pymic.util.image_process import *
-from pymic.transform.intensity import *
-
-def chanel_block_wise_mask(image, block_size, mask_prob):
- C, D, H, W = image.shape
- img_out = copy.deepcopy(image)
- block = np.zeros(block_size)
- for c in range(C):
- for d in range(0, D, block_size[0]):
- d1 = min(d + block_size[0], D)
- for h in range(0, H, block_size[1]):
- h1 = min(h + block_size[1], H)
- for w in range(0, W, block_size[2]):
- w1 = min(w + block_size[2], W)
- if (random.random() < mask_prob):
- img_out[c, d:d1, h:h1, w:w1] = block
- return img_out
-
-class Crop4VoxMMSD(CenterCrop):
- """Take two random crops of one image as the query and key."""
-
- def __init__(self, params):
- self.output_size = params['Crop4VoxMMSD_output_size'.lower()]
- self.min_overlap = params.get('Crop4VoxMMSD_min_overlap'.lower(), [8, 12, 12])
- self.max_voxel = params.get('Crop4VoxMMSD_max_voxel'.lower(), 1024)
- self.base_transform = params.get('Crop4VoxMMSD_base_transform'.lower(), None)
- self.inverse = params.get('Crop4VoxMMSD_inverse'.lower(), False)
- self.task = params['Task'.lower()]
- assert isinstance(self.output_size, (list, tuple))
-
- def __call__(self, sample):
- image = sample['image']
- channel, input_size = image.shape[0], image.shape[1:]
- input_dim = len(input_size)
- assert(input_dim == len(self.output_size))
-
- min_overlap = [max(self.output_size[i]*2 - input_size[i], self.min_overlap[i]) for i in range(3)]
- patches_1, patches_2, voxels_1, voxels_2 = sample_views(image,
- min_overlap, self.output_size, self.max_voxel)
-
- label_1, label_2 = copy.deepcopy(patches_1), copy.deepcopy(patches_2)
- sample_1 = {"image": patches_1}
- sample_2 = {"image": patches_2}
- if(self.base_transform is not None):
- image_1 = self.base_transform(sample_1)["image"]
- image_2 = self.base_transform(sample_2)["image"]
- # sample['image'] = patches_1, patches_2, voxels_1, voxels_2
- # while(1):
- # sample_1 = copy.deepcopy(x)
- # sample_2 = copy.deepcopy(x)
- # image_1 = sample_1['image']
- # image_2 = sample_2['image']
- # voxels_1 = np.argwhere(image_1!=0)
- # voxels_2 = np.argwhere(image_2!=0)
- # # print(voxels_1.max(),voxels_2.max())
-
- # box_1 = sample_box(image_1.shape, patch_size)
- # box_2 = sample_box(image_2.shape, patch_size)
- # image_1 = image_1[tuple(slice(st,end) for st,end in zip(box_1[0],box_1[1]))]
- # image_2 = image_2[tuple(slice(st,end) for st,end in zip(box_2[0],box_2[1]))]
- # sample_1['image'] = image_1
- # sample_2['image'] = image_2
- # label_1 = copy.deepcopy(self.norm(sample_1)['image'])
- # label_2 = copy.deepcopy(self.norm(sample_2)['image'])
- # image_1 = self.mask_transform(sample_1)['image']
- # image_2 = self.mask_transform(sample_2)['image']
-
- # shift_1 = box_1[0]
- # voxels_1 = voxels_1 - shift_1
- # shift_2 = box_2[0]
- # voxels_2 = voxels_2 - shift_2
-
- # valid_1 = np.all((voxels_1 >= 0) & (voxels_1 < patch_size), axis=1)
- # valid_2 = np.all((voxels_2 >= 0) & (voxels_2 < patch_size), axis=1)
- # valid = valid_1 & valid_2
- # indices = np.where(valid)[0]
-
- # overlapping_voxels_1 = voxels_1[indices]
- # overlapping_voxels_2 = voxels_2[indices]
- # # print(overlapping_voxels_1.max(),overlapping_voxels_2.max())
- # random_mod_index_1 = np.random.randint(0,4,size=overlapping_voxels_1.shape[0])
- # random_mod_index_2 = np.random.randint(0,4,size=overlapping_voxels_2.shape[0])
- # unmasked_valid_1 = image_1[random_mod_index_1,overlapping_voxels_1[:,1],overlapping_voxels_1[:,2],overlapping_voxels_1[:,3]]>0
- # unmasked_valid_2 = image_2[random_mod_index_2,overlapping_voxels_2[:,1],overlapping_voxels_2[:,2],overlapping_voxels_2[:,3]]>0
-
- # unmasked_valid = unmasked_valid_1 & unmasked_valid_2
-
- # if(np.sum(unmasked_valid)>=max_num_voxels):
- # choice_index = np.random.choice(np.arange(unmasked_valid.shape[0])[unmasked_valid],max_num_voxels, replace=False)
- # final_indices_1 = np.array([random_mod_index_1[choice_index],overlapping_voxels_1[choice_index,1],overlapping_voxels_1[choice_index,2],overlapping_voxels_1[choice_index,3]]).T
- # final_indices_2 = np.array([random_mod_index_2[choice_index],overlapping_voxels_2[choice_index,1],overlapping_voxels_2[choice_index,2],overlapping_voxels_2[choice_index,3]]).T
- # break
-
- # sample_1['image']=image_1
- # sample_2['image']=image_2
- # image_1 = self.base_transform(sample_1)['image']
- # image_2 = self.base_transform(sample_2)['image']
- sample_out = {}
- sample_out['label'] = [label_1, label_2]
- sample_out['image'] = [image_1, image_2]
- sample_out['voxel'] = [voxels_1, voxels_2]
- return sample_out
-
diff --git a/pymic/transform/extract_channel.py b/pymic/transform/extract_channel.py
deleted file mode 100644
index c4974be..0000000
--- a/pymic/transform/extract_channel.py
+++ /dev/null
@@ -1,39 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-
-import torch
-import json
-import math
-import random
-import numpy as np
-from scipy import ndimage
-from pymic import TaskType
-from pymic.transform.abstract_transform import AbstractTransform
-from pymic.util.image_process import *
-
-
-class ExtractChannel(AbstractTransform):
- """ Random flip the image. The shape is [C, D, H, W] or [C, H, W].
-
- The arguments should be written in the `params` dictionary, and it has the
- following fields:
-
- :param `RandomFlip_flip_depth`: (bool)
- Random flip along depth axis or not, only used for 3D images.
- :param `RandomFlip_flip_height`: (bool) Random flip along height axis or not.
- :param `RandomFlip_flip_width`: (bool) Random flip along width axis or not.
- :param `RandomFlip_inverse`: (optional, bool) Is inverse transform needed for inference.
- Default is `True`.
- """
- def __init__(self, params):
- super(ExtractChannel, self).__init__(params)
- self.channels = params['ExtractChannel_channels'.lower()]
- self.inverse = params.get('ExtractChannel_inverse'.lower(), False)
-
- def __call__(self, sample):
- image = sample['image']
- image_extract = []
- for i in self.channels:
- image_extract.append(image[i])
- sample['image'] = np.asarray(image_extract)
- return sample
diff --git a/pymic/transform/flip.py b/pymic/transform/flip.py
deleted file mode 100644
index 6ffd535..0000000
--- a/pymic/transform/flip.py
+++ /dev/null
@@ -1,71 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-
-import torch
-import json
-import math
-import random
-import numpy as np
-from pymic import TaskType
-from pymic.transform.abstract_transform import AbstractTransform
-from pymic.util.image_process import *
-
-
-class RandomFlip(AbstractTransform):
- """ Random flip the image. The shape is [C, D, H, W] or [C, H, W].
-
- The arguments should be written in the `params` dictionary, and it has the
- following fields:
-
- :param `RandomFlip_flip_depth`: (bool)
- Random flip along depth axis or not, only used for 3D images.
- :param `RandomFlip_flip_height`: (bool) Random flip along height axis or not.
- :param `RandomFlip_flip_width`: (bool) Random flip along width axis or not.
- :param `RandomFlip_inverse`: (optional, bool) Is inverse transform needed for inference.
- Default is `True`.
- """
- def __init__(self, params):
- super(RandomFlip, self).__init__(params)
- self.flip_depth = params['RandomFlip_flip_depth'.lower()]
- self.flip_height = params['RandomFlip_flip_height'.lower()]
- self.flip_width = params['RandomFlip_flip_width'.lower()]
- self.inverse = params.get('RandomFlip_inverse'.lower(), True)
-
- def __call__(self, sample):
- image = sample['image']
- input_dim = image.ndim
- flip_axis = []
- if(self.flip_width):
- if(random.random() > 0.5):
- flip_axis.append(-1)
- if(self.flip_height):
- if(random.random() > 0.5):
- flip_axis.append(-2)
- if(input_dim == 3 and self.flip_depth):
- if(random.random() > 0.5):
- flip_axis.append(-3)
-
- sample['RandomFlip_Param'] = json.dumps(flip_axis)
- if(len(flip_axis) > 0):
- # use .copy() to avoid negative strides of numpy array
- # current pytorch does not support negative strides
- image_t = np.flip(image, flip_axis).copy()
- sample['image'] = image_t
- if('label' in sample and \
- self.task in [TaskType.SEGMENTATION, TaskType.RECONSTRUCTION]):
- sample['label'] = np.flip(sample['label'] , flip_axis).copy()
- if('pixel_weight' in sample and \
- self.task in [TaskType.SEGMENTATION, TaskType.RECONSTRUCTION]):
- sample['pixel_weight'] = np.flip(sample['pixel_weight'] , flip_axis).copy()
-
- return sample
-
- def inverse_transform_for_prediction(self, sample):
- if(isinstance(sample['RandomFlip_Param'], list) or \
- isinstance(sample['RandomFlip_Param'], tuple)):
- flip_axis = json.loads(sample['RandomFlip_Param'][0])
- else:
- flip_axis = json.loads(sample['RandomFlip_Param'])
- if(len(flip_axis) > 0):
- sample['predict'] = np.flip(sample['predict'] , flip_axis).copy()
- return sample
\ No newline at end of file
diff --git a/pymic/transform/intensity.py b/pymic/transform/intensity.py
deleted file mode 100644
index c6f221c..0000000
--- a/pymic/transform/intensity.py
+++ /dev/null
@@ -1,704 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-import copy
-import itertools
-import json
-import math
-import random
-import numpy as np
-from scipy import ndimage
-from skimage import exposure
-from pymic.transform.abstract_transform import AbstractTransform
-from pymic.util.image_process import *
-try: # SciPy >= 0.19
- from scipy.special import comb
-except ImportError:
- from scipy.misc import comb
-
-def bernstein_poly(i, n, t):
- """
- The Bernstein polynomial of n, i as a function of t
- """
-
- return comb(n, i) * ( t**(n-i) ) * (1 - t)**i
-
-def bezier_curve(points, nTimes=1000):
- """
- Given a set of control points, return the
- bezier curve defined by the control points.
- Control points should be a list of lists, or list of tuples
- such as [ [1,1],
- [2,3],
- [4,5], ..[Xn, Yn] ]
- nTimes is the number of time steps, defaults to 1000
- See http://processingjs.nihongoresources.com/bezierinfo/
- """
-
- nPoints = len(points)
- xPoints = np.array([p[0] for p in points])
- yPoints = np.array([p[1] for p in points])
-
- t = np.linspace(0.0, 1.0, nTimes)
-
- polynomial_array = np.array([ bernstein_poly(i, nPoints-1, t) for i in range(0, nPoints)])
-
- xvals = np.dot(xPoints, polynomial_array)
- yvals = np.dot(yPoints, polynomial_array)
-
- return xvals, yvals
-
-
-class IntensityClip(AbstractTransform):
- """
- Clip the intensity for input image
-
- The arguments should be written in the `params` dictionary, and it has the
- following fields:
-
- :param `IntensityClip_channels`: (list) A list of int for specifying the channels.
- :param `IntensityClip_lower`: (list) The lower bound for clip in each channel.
- :param `IntensityClip_upper`: (list) The upper bound for clip in each channel.
- :param `IntensityClip_inverse`: (optional, bool)
- Is inverse transform needed for inference. Default is `False`.
- """
- def __init__(self, params):
- super(IntensityClip, self).__init__(params)
- self.channels = params['IntensityClip_channels'.lower()]
- self.lower = params.get('IntensityClip_lower'.lower(), None)
- self.upper = params.get('IntensityClip_upper'.lower(), None)
- self.perct = params.get('IntensityClip_percentile_mode'.lower(), False)
- self.inverse = params.get('IntensityClip_inverse'.lower(), False)
-
- def __call__(self, sample):
- image = sample['image']
- lower = self.lower if self.lower is not None else [None] * len(self.channels)
- upper = self.upper if self.upper is not None else [None] * len(self.channels)
- for chn in self.channels:
- lower_c, upper_c = lower[chn], upper[chn]
- if(lower_c is None):
- lower_c = np.percentile(image[chn], 0.05)
- elif(self.perct):
- lower_c = np.percentile(image[chn], lower_c)
- if(upper_c is None):
- upper_c = np.percentile(image[chn], 99.95)
- elif(self.perct):
- upper_c = np.percentile(image[chn], upper_c)
- image[chn] = np.clip(image[chn], lower_c, upper_c)
- sample['image'] = image
- return sample
-
-class HistEqual(AbstractTransform):
- """
- Histogram equalization. Note that the output will be in the range of [0, 1].
-
- The arguments should be written in the `params` dictionary, and it has the
- following fields:
-
- :param `HistEqual_channels`: (list) A list of int for specifying the channels.
- :param `HistEqual_bin`: (int) The number of bins.
- :param `HistEqual_inverse`: (optional, bool)
- Is inverse transform needed for inference. Default is `False`.
- """
- def __init__(self, params):
- super(HistEqual, self).__init__(params)
- self.channels = params.get('HistEqual_channels'.lower(), None)
- # self.min = params.get('HistEqual_min'.lower(), None)
- # self.max = params.get('HistEqual_max'.lower(), None)
- self.bin = params.get('HistEqual_bin'.lower(), 2000)
- self.inverse = params.get('HistEqual_inverse'.lower(), False)
-
- def __call__(self, sample):
- image = sample['image']
- C = image.shape[0]
- chns = range(C) if self.channels is None else self.channels
- for i in range(len(chns)):
- c = chns[i]
- image[c] = exposure.equalize_hist(image[c],nbins= self.bin)
- sample['image'] = image
- return sample
-
-class GammaCorrection(AbstractTransform):
- """
- Apply random gamma correction to given channels.
-
- The arguments should be written in the `params` dictionary, and it has the
- following fields:
-
- :param `GammaCorrection_channels`: (list) A list of int for specifying the channels.
- :param `GammaCorrection_gamma_min`: (float) The minimal gamma value.
- :param `GammaCorrection_gamma_max`: (float) The maximal gamma value.
- :param `GammaCorrection_probability`: (optional, float)
- The probability of applying GammaCorrection. Default is 0.5.
- :param `GammaCorrection_inverse`: (optional, bool)
- Is inverse transform needed for inference. Default is `False`.
- """
- def __init__(self, params):
- super(GammaCorrection, self).__init__(params)
- self.channels = params.get('GammaCorrection_channels'.lower(), None)
- self.gamma_min = params.get('GammaCorrection_gamma_min'.lower(), 0.7)
- self.gamma_max = params.get('GammaCorrection_gamma_max'.lower(), 1.5)
- self.flip_prob = params.get('GammaCorrection_intensity_flip_probability'.lower(), 0.0)
- self.prob = params.get('GammaCorrection_probability'.lower(), 0.5)
- self.prob_per_channel = params.get('GammaCorrection_probability_per_channel'.lower(), 0.5)
- self.inverse = params.get('GammaCorrection_inverse'.lower(), False)
-
- def __call__(self, sample):
- if(np.random.uniform() > self.prob):
- return sample
- else:
- image= sample['image']
- if(self.channels is None):
- self.channels = range(image.shape[0])
- for chn in self.channels:
- if(np.random.uniform() > self.prob_per_channel):
- continue
- gamma_c = random.random() * (self.gamma_max - self.gamma_min) + self.gamma_min
- img_c = image[chn]
- v_min = img_c.min()
- v_max = img_c.max()
- if(v_min < v_max):
- img_c = (img_c - v_min)/(v_max - v_min)
- if(np.random.uniform() < self.flip_prob):
- img_c = 1.0 - img_c
- img_c = np.power(img_c, gamma_c)*(v_max - v_min) + v_min
- image[chn] = img_c
-
- sample['image'] = image
- return sample
-
-def gaussian_noise(image, std_min, std_max,):
- """
- The input has a shape of [C, D, H, W] or [D, H, W].
- In the former case, volume-level noise will be added.
- In the latter case, slice-level noise will ba added.
- """
- v_min = image.min()
- v_max = image.max()
- std = random.random() * (std_max - std_min) + std_min
- noise = np.random.normal(0, std, image.shape)
- out = image + noise
- out = np.clip(out, v_min, v_max)
- return out
-
-def gaussian_blur(image, sigma_min, sigma_max):
- sigma = random.random() * (sigma_max - sigma_min) + sigma_min
- out = ndimage.gaussian_filter(image, sigma, order = 0)
- return out
-
-def gaussian_sharpen(image, sigma_min, sigma_max, alpha = 10.0):
- blurred = gaussian_blur(image, sigma_min, sigma_max)
- out = image + (image - blurred) * alpha
- return out
-
-def augment_contrast(image, factor_min, factor_max, preserve_range = True):
- mn = image.mean()
- factor = np.random.uniform(factor_min, factor_max)
- if preserve_range:
- minm = image.min()
- maxm = image.max()
- out = (image - mn) * factor + mn
- if preserve_range:
- out = np.clip(out, minm, maxm)
- return out
-
-def window_level_augment(image, offset = 0.1):
- v_min = image.min()
- v_max = image.max()
- margin = (v_max - v_min) * offset
- v0 = random.uniform(v_min - margin, v_min + margin)
- v1 = random.uniform(v_max - margin, v_max + margin)
- out = np.clip((image - v0) / (v1 - v0), 0, 1)
- return out
-
-def gamma_correction(image, gamma_min, gamma_max):
- v_min = image.min()
- v_max = image.max()
- if(v_min < v_max):
- image = (image - v_min)/(v_max - v_min)
- gamma = random.random() * (gamma_max - gamma_min) + gamma_min
- image = np.power(image, gamma)*(v_max - v_min) + v_min
- return image
-
-class GaussianNoise(AbstractTransform):
- """
- Add Gaussian Noise to given channels.
-
- The arguments should be written in the `params` dictionary, and it has the
- following fields:
-
- :param `GaussianNoise_channels`: (list) A list of int for specifying the channels.
- :param `GaussianNoise_mean`: (float) The mean value of noise.
- :param `GaussianNoise_std`: (float) The std of noise.
- :param `GaussianNoise_probability`: (optional, float)
- The probability of applying GaussianNoise. Default is 0.5.
- :param `GaussianNoise_inverse`: (optional, bool)
- Is inverse transform needed for inference. Default is `False`.
- """
- def __init__(self, params):
- super(GaussianNoise, self).__init__(params)
- self.channels = params.get('GaussianNoise_channels'.lower(), None)
- self.std_min = params.get('GaussianNoise_std_min'.lower(), 0.02)
- self.std_max = params.get('GaussianNoise_std_max'.lower(), 0.1)
- self.prob = params.get('GaussianNoise_probability'.lower(), 0.5)
- self.prob_per_channel = params.get('GaussianNoise_probability_per_channel'.lower(), 0.5)
- self.inverse = params.get('GaussianNoise_inverse'.lower(), False)
-
- def __call__(self, sample):
- if(np.random.uniform() > self.prob):
- return sample
- else:
- image = sample['image']
- if(self.channels is None):
- self.channels = range(image.shape[0])
- for chn in self.channels:
- if(np.random.uniform() < self.prob_per_channel):
- image[chn] = gaussian_noise(image[chn], self.std_min, self.std_max)
- sample['image'] = image
- return sample
-
-class GaussianBlur(AbstractTransform):
- def __init__(self, params):
- super(GaussianBlur, self).__init__(params)
- self.channels = params.get('GaussianBlur_channels'.lower(), None)
- self.sigma_min = params['GaussianBlur_sigma_min'.lower()]
- self.sigma_max = params['GaussianBlur_sigma_max'.lower()]
- self.prob = params.get('GaussianBlur_probability'.lower(), 0.5)
- self.prob_per_channel = params.get('GaussianBlur_probability_per_channel'.lower(), 0.5)
-
- def __call__(self, sample):
- if(np.random.uniform() > self.prob):
- return sample
- else:
- image = sample['image']
- if(self.channels is None):
- self.channels = range(image.shape[0])
-
- for chn in self.channels:
- if(np.random.uniform() < self.prob_per_channel):
- image[chn] = gaussian_blur(image[chn], self.sigma_min, self.sigma_max)
- sample['image'] = image
-
- return sample
-
-class BrightnessAdditive(AbstractTransform):
- def __init__(self, params):
- super(BrightnessAdditive, self).__init__(params)
- self.channels = params.get('BrightnessAdditive_channels'.lower(), None)
- self.sigma_min = params['BrightnessAdditive_sigma_min'.lower()]
- self.sigma_max = params['BrightnessAdditive_sigma_max'.lower()]
- self.prob = params.get('BrightnessAdditive_probability'.lower(), 0.5)
- self.prob_per_channel = params.get('BrightnessAdditive_probability_per_channel'.lower(), 0.5)
-
- def __call__(self, sample):
- if(np.random.uniform() > self.prob):
- return sample
- else:
- image = sample['image']
- if(self.channels is None):
- self.channels = range(image.shape[0])
-
- for chn in self.channels:
- if(np.random.uniform() < self.prob_per_channel):
- sigma = random.uniform(self.sigma_min,self.sigma_max)
- image[chn] += sigma
- sample['image'] = image
- return sample
-
-class BrightnessMultiplicative(AbstractTransform):
- def __init__(self, params):
- super(BrightnessMultiplicative, self).__init__(params)
- self.channels = params.get('BrightnessMultiplicative_channels'.lower(), None)
- self.sigma_min = params['BrightnessMultiplicative_sigma_min'.lower()]
- self.sigma_max = params['BrightnessMultiplicative_sigma_max'.lower()]
- self.prob = params.get('BrightnessMultiplicative_probability'.lower(), 0.5)
- self.prob_per_channel = params.get('BrightnessMultiplicative_probability_per_channel'.lower(), 0.5)
-
- def __call__(self, sample):
- if(np.random.uniform() > self.prob):
- return sample
- else:
- image = sample['image']
- if(self.channels is None):
- self.channels = range(image.shape[0])
-
- for chn in self.channels:
- if(np.random.uniform() < self.prob_per_channel):
- sigma = random.uniform(self.sigma_min,self.sigma_max)
- image[chn] *= sigma
-
- sample['image'] = image
- return sample
-
-class ContrastAdjust(AbstractTransform):
- def __init__(self, params):
- super(ContrastAdjust, self).__init__(params)
- self.channels = params.get('ContrastAdjust_channels'.lower(), None)
- self.factor_min = params.get('ContrastAdjust_factor_min'.lower(), 0.75)
- self.factor_max = params.get('ContrastAdjust_factor_max'.lower(), 1.25)
- self.preserve_range = params.get('ContrastAdjust_preserve_range'.lower(), True)
- self.prob = params.get('ContrastAdjust_probability'.lower(), 0.5)
- self.prob_per_channel = params.get('ContrastAdjust_probability_per_channel'.lower(), 0.5)
-
- def __call__(self, sample):
- if(np.random.uniform() > self.prob):
- return sample
- else:
- image = sample['image']
- if(self.channels is None):
- self.channels = range(image.shape[0])
-
- for chn in self.channels:
- if(np.random.uniform() < self.prob_per_channel):
- image[chn] = augment_contrast(image[chn],
- self.factor_min, self.factor_max, self.preserve_range)
- sample['image'] = image
- return sample
-
-def adaptive_contrast_adjust(image, p0=0.1, p1=99.9):
- v_min = image.min()
- v_max = image.max()
- v0 = np.percentile(image, p0)
- v1 = np.percentile(image, p1)
- mask_l = image < v0
- mask_m = (image >= v0) * (image <= v1)
- mask_u = image > v1
- image[mask_l] = (image[mask_l] - v_min) * 0.1 / (v0 - v_min)
- image[mask_m] = (image[mask_m] - v0) / (v1 - v0)*0.8 + 0.1
- image[mask_u] = 0.9 + 0.1 * (image[mask_u] - v1) / (v_max - v1)
- return image
-
-class AdaptiveContrastAdjust(AbstractTransform):
- """
- Add Gaussian Noise to given channels.
-
- The arguments should be written in the `params` dictionary, and it has the
- following fields:
-
- :param `GaussianNoise_channels`: (list) A list of int for specifying the channels.
- :param `GaussianNoise_mean`: (float) The mean value of noise.
- :param `GaussianNoise_std`: (float) The std of noise.
- :param `GaussianNoise_probability`: (optional, float)
- The probability of applying GaussianNoise. Default is 0.5.
- :param `GaussianNoise_inverse`: (optional, bool)
- Is inverse transform needed for inference. Default is `False`.
- """
- def __init__(self, params):
- super(AdaptiveContrastAdjust, self).__init__(params)
- self.channels = params.get('AdaptiveContrastAdjust_channels'.lower(), None)
- self.p0 = params.get('AdaptiveContrastAdjust_percent_lower'.lower(), 2)
- self.p1 = params.get('AdaptiveContrastAdjust_percent_upper'.lower(), 98)
- self.prob = params.get('AdaptiveContrastAdjust_probability'.lower(), 0.5)
- self.inverse = params.get('AdaptiveContrastAdjust_inverse'.lower(), False)
-
- def __call__(self, sample):
- image = sample['image'] * 1.0
- if(self.channels is None):
- self.channels = range(image.shape[0])
- for chn in self.channels:
- if(np.random.uniform() < self.prob):
- image[chn] = adaptive_contrast_adjust(image[chn], self.p0, self.p1)
- sample['image'] = image
- return sample
-
-class GrayscaleToRGB(AbstractTransform):
- """
- Convert gray scale images to RGB by copying channels.
- """
- def __init__(self, params):
- super(GrayscaleToRGB, self).__init__(params)
- self.inverse = params.get('GrayscaleToRGB_inverse'.lower(), False)
-
- def __call__(self, sample):
- image= sample['image']
- assert(image.shape[0] == 1 or image.shape[0] == 3)
- if(image.shape[0] == 1):
- sample['image'] = np.concatenate([image, image, image])
- return sample
-
-class NonLinearTransform(AbstractTransform):
- def __init__(self, params):
- super(NonLinearTransform, self).__init__(params)
- self.channels = params.get('NonLinearTransform_channels'.lower(), None)
- self.prob = params.get('NonLinearTransform_probability'.lower(), 0.5)
- self.inverse = params.get('NonLinearTransform_inverse'.lower(), False)
- self.block_range = params.get('NonLinearTransform_block_range'.lower(), None)
- self.block_size = params.get('NonLinearTransform_block_size'.lower(), [4, 8, 8])
-
-
- def apply_nonlinear_transform(self, img):
- """
- the input img should be normlized to [0, 1]"""
- points = [[0, 0], [random.random(), random.random()], [random.random(), random.random()], [1, 1]]
- xvals, yvals = bezier_curve(points, nTimes=10000)
- if random.random() < 0.5: # Half chance to get flip
- xvals = np.sort(xvals)
- else:
- xvals, yvals = np.sort(xvals), np.sort(yvals)
-
- img = np.interp(img, xvals, yvals)
- return img
-
- def __call__(self, sample):
- if(random.random() > self.prob):
- return sample
-
- image = sample['image']
- img_shape = image.shape
- img_dim = len(img_shape) - 1
- channels = self.channels if self.channels is not None else range(image.shape[0])
- for chn in channels:
- # normalize the image intensity to [0, 1] before the non-linear tranform
- img_c = image[chn]
- v_min, v_max = img_c.min(), img_c.max()
- if(v_min < v_max):
- img_c = (img_c - v_min)/(v_max - v_min)
- if(self.block_range is None): # apply non-linear transform to the entire image
- img_c = self.apply_nonlinear_transform(img_c)
- else: # non-linear transform to random blocks
- img_c_sr = copy.deepcopy(img_c)
- for n in range(self.block_range[0], self.block_range[1]):
- coord_min = [random.randint(0, img_shape[1+i] - self.block_size[i]) \
- for i in range(img_dim)]
- window = img_c_sr[coord_min[0]:coord_min[0] + self.block_size[0],
- coord_min[1]:coord_min[1] + self.block_size[1],
- coord_min[2]:coord_min[2] + self.block_size[2]]
- img_c[coord_min[0]:coord_min[0] + self.block_size[0],
- coord_min[1]:coord_min[1] + self.block_size[1],
- coord_min[2]:coord_min[2] + self.block_size[2]] = \
- self.apply_nonlinear_transform(window)
- image[chn] = img_c * (v_max - v_min) + v_min
- sample['image'] = image
- return sample
-
-class LocalShuffling(AbstractTransform):
- """
- local pixel shuffling of an input image, used for self-supervised learning
- """
- def __init__(self, params):
- super(LocalShuffling, self).__init__(params)
- self.inverse = params.get('LocalShuffling_inverse'.lower(), False)
- self.prob = params.get('LocalShuffling_probability'.lower(), 0.5)
- self.block_range = params.get('LocalShuffling_block_range'.lower(), [40, 80])
- self.block_size = params.get('LocalShuffling_block_size'.lower(), [4, 8, 8])
-
- def __call__(self, sample):
- if(random.random() > self.prob):
- return sample
-
- image= sample['image']
- img_shape = image.shape
- img_dim = len(img_shape) - 1
- assert(img_dim == 2 or img_dim == 3)
- img_out = copy.deepcopy(image)
-
- block_num = random.randint(self.block_range[0], self.block_range[1])
-
- for n in range(block_num):
- coord_min = [random.randint(0, img_shape[1+i] - self.block_size[i]) \
- for i in range(img_dim)]
- if(img_dim == 2):
- window = image[:, coord_min[0]:coord_min[0] + self.block_size[0],
- coord_min[1]:coord_min[1] + self.block_size[1]]
- n_pixels = self.block_size[0] * self.block_size[1]
- else:
- window = image[:, coord_min[0]:coord_min[0] + self.block_size[0],
- coord_min[1]:coord_min[1] + self.block_size[1],
- coord_min[2]:coord_min[2] + self.block_size[2]]
- n_pixels = self.block_size[0] * self.block_size[1] * self.block_size[2]
- window = np.reshape(window, [-1, n_pixels])
- np.random.shuffle(np.transpose(window))
- window = np.transpose(window)
- if(img_dim == 2):
- window = np.reshape(window, [-1, self.block_size[0], self.block_size[1]])
- img_out[:, coord_min[0]:coord_min[0] + self.block_size[0],
- coord_min[1]:coord_min[1] + self.block_size[1]] = window
- else:
- window = np.reshape(window, [-1, self.block_size[0], self.block_size[1], self.block_size[2]])
- img_out[:, coord_min[0]:coord_min[0] + self.block_size[0],
- coord_min[1]:coord_min[1] + self.block_size[1],
- coord_min[2]:coord_min[2] + self.block_size[2]] = window
- sample['image'] = img_out
- return sample
-
-class InPainting(AbstractTransform):
- """
- In-painting of an input image, used for self-supervised learning
- """
- def __init__(self, params):
- super(InPainting, self).__init__(params)
- self.inverse = params.get('InPainting_inverse'.lower(), False)
- self.prob = params.get('InPainting_probability'.lower(), 0.5)
- self.block_range = params.get('InPainting_block_range'.lower(), (20, 40))
- self.block_size = params.get('InPainting_block_size'.lower(), [4, 8, 8])
-
- def __call__(self, sample):
- if(random.random() > self.prob):
- return sample
-
- image= sample['image']
- img_shape = image.shape
- img_dim = len(img_shape) - 1
- assert(img_dim == 2 or img_dim == 3)
-
- block_num = random.randint(self.block_range[0], self.block_range[1])
-
- for n in range(block_num):
- coord_min = [random.randint(3, img_shape[1+i] - self.block_size[i] - 3) \
- for i in range(img_dim)]
- if(img_dim == 2):
- random_block = np.random.rand(img_shape[0], self.block_size[0], self.block_size[1]) * 2 -1
- image[:, coord_min[0]:coord_min[0] + self.block_size[0],
- coord_min[1]:coord_min[1] + self.block_size[1]] = random_block
- else:
- random_block = np.random.rand(img_shape[0], self.block_size[0],
- self.block_size[1], self.block_size[2]) * 2 -1
- image[:, coord_min[0]:coord_min[0] + self.block_size[0],
- coord_min[1]:coord_min[1] + self.block_size[1],
- coord_min[2]:coord_min[2] + self.block_size[2]] = random_block
- sample['image'] = image
- return sample
-
-class OutPainting(AbstractTransform):
- """
- Out-painting of an input image, used for self-supervised learning
- """
- def __init__(self, params):
- super(OutPainting, self).__init__(params)
- self.inverse = params.get('OutPainting_inverse'.lower(), False)
- self.prob = params.get('OutPainting_probability'.lower(), 0.5)
- self.block_range = params.get('OutPainting_block_range'.lower(), (2, 8))
- self.block_size = params.get('OutPainting_block_size'.lower(), None)
-
- def __call__(self, sample):
- if(random.random() > self.prob):
- return sample
-
- image= sample['image']
- img_shape = image.shape
- img_dim = len(img_shape) - 1
- assert(img_dim == 2 or img_dim == 3)
- img_out = np.random.rand(*img_shape) * 2 -1
-
- if(self.block_size is None):
- margin = [16, 32, 32]
- block_size = [img_shape[1+i] - margin[i] for i in range(img_dim)]
- else:
- assert(len(self.block_size) == img_dim)
- block_size = self.block_size
-
- block_num = random.randint(self.block_range[0], self.block_range[1])
-
- for n in range(block_num):
- coord_min = [random.randint(3, img_shape[1+i] - block_size[i] - 3) \
- for i in range(img_dim)]
- if(img_dim == 2):
- img_out[:, coord_min[0]:coord_min[0] + block_size[0],
- coord_min[1]:coord_min[1] + block_size[1]] = \
- image[:, coord_min[0]:coord_min[0] + block_size[0],
- coord_min[1]:coord_min[1] + block_size[1]]
- else:
- img_out[:, coord_min[0]:coord_min[0] + block_size[0],
- coord_min[1]:coord_min[1] + block_size[1],
- coord_min[2]:coord_min[2] + block_size[2]] = \
- image[:, coord_min[0]:coord_min[0] + block_size[0],
- coord_min[1]:coord_min[1] + block_size[1],
- coord_min[2]:coord_min[2] + block_size[2]]
- sample['image'] = img_out
- return sample
-
-class InOutPainting(AbstractTransform):
- """
- Apply in-painting or out-patining randomly. They are mutually exclusive.
- """
- def __init__(self, params):
- super(InOutPainting, self).__init__(params)
- self.inverse = params.get('InOutPainting_inverse'.lower(), False)
- self.prob = params.get('InOutPainting_probability'.lower(), 0.5)
- self.in_prob = params.get('InPainting_probability'.lower(), 0.5)
- params['InPainting_probability'.lower()] = 1.0
- params['OutPainting_probability'.lower()] = 1.0
- self.inpaint = InPainting(params)
- self.outpaint = OutPainting(params)
-
- def __call__(self, sample):
- if(random.random() > self.prob):
- return sample
- if(random.random() < self.in_prob):
- sample = self.inpaint(sample)
- else:
- sample = self.outpaint(sample)
- return sample
-
-class PatchSwaping(AbstractTransform):
- """
- Apply patch swaping for context restoration in self-supervised learning.
- Reference: Liang Chen et al., Self-supervised learning for medical image analysis
- using image context restoration, Medical Image Analysis, 2019.
- """
- def __init__(self, params):
- super(PatchSwaping, self).__init__(params)
- self.block_range = params.get('PatchSwaping_block_range'.lower(), (10, 20))
- self.block_size = params.get('PatchSwaping_block_size'.lower(), [8, 16, 16])
- self.inverse = params.get('PatchSwaping_inverse'.lower(), False)
-
- def __call__(self, sample):
- image= sample['image']
- img_shape = image.shape
- img_dim = len(img_shape) - 1
- assert(img_dim == 2 or img_dim == 3)
- img_out = copy.deepcopy(image)
-
- block_num = random.randint(self.block_range[0], self.block_range[1])
- for t in range(block_num):
- pos_a0 = [random.randint(0, img_shape[-3+i] - self.block_size[i]) for i in range(img_dim)]
- pos_b0 = [random.randint(0, img_shape[-3+i] - self.block_size[i]) for i in range(img_dim)]
- pos_a1 = [pos_a0[i] + self.block_size[i] for i in range(img_dim)]
- pos_b1 = [pos_b0[i] + self.block_size[i] for i in range(img_dim)]
- img_out[:, pos_a0[0]:pos_a1[0], pos_a0[1]:pos_a1[1], pos_a0[2]:pos_a1[2]] = \
- image[:, pos_b0[0]:pos_b1[0], pos_b0[1]:pos_b1[1], pos_b0[2]:pos_b1[2]]
- img_out[:, pos_b0[0]:pos_b1[0], pos_b0[1]:pos_b1[1], pos_b0[2]:pos_b1[2]] = \
- image[:, pos_a0[0]:pos_a1[0], pos_a0[1]:pos_a1[1], pos_a0[2]:pos_a1[2]]
-
- sample['image'] = img_out
- sample['label'] = image
- return sample
-
-class MaskedImageModeling(AbstractTransform):
- """
- Apply masking for context restoration in self-supervised learning.
- Reference: Zekai Chen et al., Masked Image Modeling Advances 3D Medical Image Analysis,
- WACV, 2023 .
- """
- def __init__(self, params):
- super(MaskedImageModeling, self).__init__(params)
- self.ratio = params.get('MaskedImageModeling_ratio'.lower(), 0.45)
- self.block_size = params.get('MaskedImageModeling_block_size'.lower(), [8, 16, 16])
- self.per_chanel = params.get('MaskedImageModeling_per_channel'.lower(), False)
- self.inverse = params.get('MaskedImageModeling_inverse'.lower(), False)
-
- def __call__(self, sample):
- image= sample['image']
- C, D, H, W = image.shape
- img_out = copy.deepcopy(image)
-
- if(self.per_chanel):
- block = np.zeros(list(self.block_size))
- else:
- block = np.zeros([C] + list(self.block_size))
- for d in range(0, D, self.block_size[0]):
- d1 = min(d + self.block_size[0], D)
- for h in range(0, H, self.block_size[1]):
- h1 = min(h + self.block_size[1], H)
- for w in range(0, W, self.block_size[2]):
- w1 = min(w + self.block_size[2], W)
- if(self.per_chanel):
- for c in range(C):
- if(random.random() < self.ratio):
- img_out[c, d:d1, h:h1, w:w1] = block
- else:
- if (random.random() < self.ratio):
- img_out[:, d:d1, h:h1, w:w1] = block
-
- sample['image'] = img_out
- sample['label'] = image
- return sample
\ No newline at end of file
diff --git a/pymic/transform/label_convert.py b/pymic/transform/label_convert.py
deleted file mode 100644
index 8729801..0000000
--- a/pymic/transform/label_convert.py
+++ /dev/null
@@ -1,240 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-
-import torch
-import json
-import math
-import random
-import numpy as np
-from scipy import ndimage
-from pymic import TaskType
-from pymic.transform.abstract_transform import AbstractTransform
-from pymic.util.image_process import *
-
-class ReduceLabelDim(AbstractTransform):
- """
- Remove the first dimension of label tensor.
- """
- def __init__(self, params):
- super(ReduceLabelDim, self).__init__(params)
- self.inverse = params.get('ReduceLabelDim_inverse'.lower(), False)
-
- def __call__(self, sample):
- label = sample['label']
- label_converted = label[0]
- sample['label'] = label_converted
- return sample
-
-class LabelSelect(AbstractTransform):
- """
- Select a subset of foreground labels for segmentation tasks, and map the label index to 1-N,
- where N is the number of new foreground labels.
-
- The arguments should be written in the `params` dictionary, and it has the
- following fields:
-
- :param `LabelSelect_target_list`: (list) The target label list.
- :param `LabelSelect_inverse`: (optional, bool)
- Is inverse transform needed for inference. Default is `False`.
- """
- def __init__(self, params):
- super(LabelSelect, self).__init__(params)
- self.target_list = params['LabelSelect_target_list'.lower()]
- self.inverse = params.get('LabelSelect_inverse'.lower(), False)
-
- def __call__(self, sample):
- label = sample['label']
- label_new = np.zeros_like(label)
- for i in range(len(self.target_list)):
- source_lab = self.target_list[i]
- target_lab = i + 1
- label_new = (label == source_lab) * target_lab + label_new
- sample['label'] = label_new
- return sample
-
-class LabelConvert(AbstractTransform):
- """
- Convert the label based on a source list and target list.
-
- The arguments should be written in the `params` dictionary, and it has the
- following fields:
-
- :param `LabelConvert_source_list`: (list) A list of labels to be converted.
- :param `LabelConvert_target_list`: (list) The target label list.
- :param `LabelConvert_inverse`: (optional, bool)
- Is inverse transform needed for inference. Default is `False`.
- """
- def __init__(self, params):
- super(LabelConvert, self).__init__(params)
- self.source_list = params['LabelConvert_source_list'.lower()]
- self.target_list = params['LabelConvert_target_list'.lower()]
- self.inverse = params.get('LabelConvert_inverse'.lower(), False)
- assert(len(self.source_list) == len(self.target_list))
-
- def __call__(self, sample):
- label = sample['label']
- label_converted = convert_label(label, self.source_list, self.target_list)
- sample['label'] = label_converted
- return sample
-
-class LabelConvertNonzero(AbstractTransform):
- """
- Convert label into binary, i.e., setting nonzero labels as 1.
- """
- def __init__(self, params):
- super(LabelConvertNonzero, self).__init__(params)
- self.inverse = params.get('LabelConvertNonzero_inverse'.lower(), False)
-
- def __call__(self, sample):
- label = sample['label']
- label_converted = np.asarray(label > 0, np.uint8)
- sample['label'] = label_converted
- return sample
-
-class LabelToProbability(AbstractTransform):
- """
- Convert one-channel label map to one-hot multi-channel probability map.
-
- The arguments should be written in the `params` dictionary, and it has the
- following fields:
-
- :param `LabelToProbability_class_num`: (int) The class number in the label map.
- :param `LabelToProbability_inverse`: (optional, bool)
- Is inverse transform needed for inference. Default is `False`.
- """
- def __init__(self, params):
- super(LabelToProbability, self).__init__(params)
- self.class_num = params['LabelToProbability_class_num'.lower()]
- self.inverse = params.get('LabelToProbability_inverse'.lower(), False)
-
- def __call__(self, sample):
- if(self.task == TaskType.SEGMENTATION):
- label = sample['label'][0] # sample['label'] is (1, h, w)
- label_prob = np.zeros((self.class_num, *label.shape), dtype = np.float32)
- for i in range(self.class_num):
- label_prob[i] = label == i*np.ones_like(label)
- sample['label_prob'] = label_prob
- elif(self.task == TaskType.CLASSIFICATION_ONE_HOT):
- label_idx = sample['label']
- label_prob = np.zeros((self.class_num,), np.float32)
- label_prob[label_idx] = 1.0
- sample['label_prob'] = label_prob
- elif(self.task == TaskType.CLASSIFICATION_COEXIST):
- sample['label_prob'] = sample['label']
- return sample
-
-class LabelSmooth(AbstractTransform):
- """
- Apply label smoothing to one-hot labels.
-
- The arguments should be written in the `params` dictionary, and it has the
- following fields:
-
- :param `LabelSmooth_alpha`: (float) Alpha value for label smoothing.
- :param `LabelSmooth_inverse`: (optional, bool)
- Is inverse transform needed for inference. Default is `False`.
- """
- def __init__(self, params):
- super(LabelSmooth, self).__init__(params)
- self.alpha = params['LabelSmooth_alpha'.lower()]
- self.inverse = params.get('LabelSmooth_inverse'.lower(), False)
-
- def __call__(self, sample):
- label_prob = sample['label_prob']
- K = list(label_prob.shape)[1]
- sample['label_prob'] = label_prob * (1.0 - self.alpha) + self.alpha / K
- return sample
-
-class PartialLabelToProbability(AbstractTransform):
- """
- Convert one-channel partial label map to one-hot multi-channel probability map.
- This is used for segmentation tasks only. In the input label map, 0 represents the
- background class, 1 to C-1 represent the foreground classes, and C represents
- unlabeled pixels. In the output dictionary, `label_prob` is the one-hot probability
- map, and `pixel_weight` represents a weighting map, where the weight for a pixel
- is 0 if the label is unkown.
-
- The arguments should be written in the `params` dictionary, and it has the
- following fields:
-
- :param `PartialLabelToProbability_class_num`: (int) The class number for the
- segmentation task.
- :param `PartialLabelToProbability_inverse`: (optional, bool)
- Is inverse transform needed for inference. Default is `False`.
- """
- def __init__(self, params):
- """
- class_num (int): the class number in the label map
- """
- super(PartialLabelToProbability, self).__init__(params)
- self.class_num = params['PartialLabelToProbability_class_num'.lower()]
- self.inverse = params.get('PartialLabelToProbability_inverse'.lower(), False)
-
- def __call__(self, sample):
- label = sample['label'][0]
- assert(label.max() <= self.class_num)
-
- label_prob = np.zeros((self.class_num, *label.shape), dtype = np.float32)
- for i in range(self.class_num):
- label_prob[i] = label == i*np.ones_like(label)
- sample['label_prob'] = label_prob
- sample['pixel_weight'] = 1.0 - np.asarray([label == self.class_num], np.float32)
- return sample
-
-
-class SelfReconstructionLabel(AbstractTransform):
- """
- Used for self-supervised learning with image reconstruction tasks.
- """
- def __init__(self, params):
- """
- class_num (int): the class number in the label map
- """
- super(SelfReconstructionLabel, self).__init__(params)
- self.inverse = params.get('SelfReconstructionLabel_inverse'.lower(), False)
-
- def __call__(self, sample):
- image = sample['image']
- label = image * 1.0
- sample['label'] = label
- return sample
-
-
-class MaskedImageModelingLabel(AbstractTransform):
- """
- Used for self-supervised learning with image reconstruction tasks.
- Only reconstruct the masked region in the input.
- The input images is masked in local patches.
- """
- def __init__(self, params):
- """
- class_num (int): the class number in the label map
- """
- super(MaskedImageModelingLabel, self).__init__(params)
- self.patch_size = params.get('MaskedImageModelingLabel_patch_size'.lower(), [16, 16, 16])
- self.masking_ratio = params.get('MaskedImageModelingLabel_ratio'.lower(), 0.15)
- self.inverse = params.get('MaskedImageModelingLabel_inverse'.lower(), False)
-
- def __call__(self, sample):
- image = sample['image']
- C, D, H, W = image.shape
- patch_size = self.patch_size
- mask = np.ones([D, H, W], np.float32)
- grid_size = [math.ceil((image.shape[i+1] + 0.0) / patch_size[i]) for i in range(3)]
- for d in range(grid_size[0]):
- d0 = d*patch_size[0]
- for h in range(grid_size[1]):
- h0 = h*patch_size[1]
- for w in range(grid_size[2]):
- w0 = w*patch_size[2]
- if(random.random() > self.masking_ratio):
- continue
- d1 = min(d0 + patch_size[0], D)
- h1 = min(h0 + patch_size[1], H)
- w1 = min(w0 + patch_size[2], W)
- mask[d0:d1, h0:h1, w0:w1] = np.zeros([d1 - d0, h1 - h0, w1 - w0])
- sample['pixel_weight'] = 1 - mask
- sample['image'] = image * mask
- sample['label'] = image
- return sample
-
diff --git a/pymic/transform/mix.py b/pymic/transform/mix.py
deleted file mode 100644
index 6efed6a..0000000
--- a/pymic/transform/mix.py
+++ /dev/null
@@ -1,153 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-import copy
-import json
-import math
-import random
-import numpy as np
-from pymic.transform.abstract_transform import AbstractTransform
-from pymic.util.image_process import *
-try: # SciPy >= 0.19
- from scipy.special import comb
-except ImportError:
- from scipy.misc import comb
-
-
-class CopyPaste(AbstractTransform):
- """
- In-painting of an input image, used for self-supervised learning
- """
- def __init__(self, params):
- super(CopyPaste, self).__init__(params)
- self.inverse = params.get('CopyPaste_inverse'.lower(), False)
- self.block_range = params.get('CopyPaste_block_range'.lower(), (1, 6))
- self.block_size_min = params.get('CopyPaste_block_size_min'.lower(), None)
- self.block_size_max = params.get('CopyPaste_block_size_max'.lower(), None)
-
- def __call__(self, sample):
- image= sample['image']
- img_shape = image.shape
- img_dim = len(img_shape) - 1
- assert(img_dim == 2 or img_dim == 3)
-
- if(self.block_size_min is None):
- block_size_min = [img_shape[1+i]//6 for i in range(img_dim)]
- elif(isinstance(self.block_size_min, int)):
- block_size_min = [self.block_size_min] * img_dim
- else:
- assert(len(self.block_size_min) == img_dim)
- block_size_min = self.block_size_min
-
- if(self.block_size_max is None):
- block_size_max = [img_shape[1+i]//3 for i in range(img_dim)]
- elif(isinstance(self.block_size_min, int)):
- block_size_max = [self.block_size_max] * img_dim
- else:
- assert(len(self.block_size_max) == img_dim)
- block_size_max = self.block_size_max
- block_num = random.randint(self.block_range[0], self.block_range[1])
-
- for n in range(block_num):
- block_size = [random.randint(block_size_min[i], block_size_max[i]) \
- for i in range(img_dim)]
- coord_min = [random.randint(3, img_shape[1+i] - block_size[i] - 3) \
- for i in range(img_dim)]
- if(img_dim == 2):
- random_block = np.random.rand(img_shape[0], block_size[0], block_size[1])
- image[:, coord_min[0]:coord_min[0] + block_size[0],
- coord_min[1]:coord_min[1] + block_size[1]] = random_block
- else:
- random_block = np.random.rand(img_shape[0], block_size[0],
- block_size[1], block_size[2])
- image[:, coord_min[0]:coord_min[0] + block_size[0],
- coord_min[1]:coord_min[1] + block_size[1],
- coord_min[2]:coord_min[2] + block_size[2]] = random_block
- sample['image'] = image
- return sample
-
-class PatchMix(AbstractTransform):
- """
- In-painting of an input image, used for self-supervised learning
- """
- def __init__(self, params):
- super(PatchMix, self).__init__(params)
- self.inverse = params.get('PatchMix_inverse'.lower(), False)
- self.threshold = params.get('PatchMix_threshold'.lower(), 0)
- self.crop_size = params.get('PatchMix_crop_size'.lower(), [64, 128, 128])
- self.fg_cls_num = params.get('PatchMix_cls_num'.lower(), [4, 40])
- self.patch_num_range= params.get('PatchMix_patch_range'.lower(), [4, 40])
- self.patch_size_min = params.get('PatchMix_patch_size_min'.lower(), [4, 4, 4])
- self.patch_size_max = params.get('PatchMix_patch_size_max'.lower(), [20, 40, 40])
-
- def __call__(self, sample):
- x0 = self._random_crop_and_flip(sample)
- x1 = self._random_crop_and_flip(sample)
- C, D, H, W = x0.shape
- # generate mask
- fg_mask = np.zeros_like(x0, np.uint8)
- patch_num = random.randint(self.patch_num_range[0], self.patch_num_range[1])
- for patch in range(patch_num):
- d = random.randint(self.patch_size_min[0], self.patch_size_max[0])
- h = random.randint(self.patch_size_min[1], self.patch_size_max[1])
- w = random.randint(self.patch_size_min[2], self.patch_size_max[2])
- d_c = random.randint(0, D)
- h_c = random.randint(0, H)
- w_c = random.randint(0, W)
- d0, d1 = max(0, d_c - d // 2), min(D, d_c + d // 2)
- h0, h1 = max(0, h_c - h // 2), min(H, h_c + h // 2)
- w0, w1 = max(0, w_c - w // 2), min(W, w_c + w // 2)
- temp_m = np.ones([C, d1-d0, h1-h0, w1-w0]) * random.randint(1, self.fg_cls_num)
- fg_mask[:, d0:d1, h0:h1, w0:w1] = temp_m
- fg_w = fg_mask * 1.0 / self.fg_cls_num
- x_fuse = fg_w*x0 + (1.0 - fg_w)*x1 # x1 is used as background
-
- sample['image'] = x_fuse
- sample['label'] = fg_mask
- return sample
-
- def _random_crop_and_flip(self, sample):
- image = sample['image']
- input_dim = len(image.shape) - 1
- assert(input_dim == 3)
- C, D, H, W = image.shape
-
- half_size = [x // 2 for x in self.crop_size]
- dc = random.randint(half_size[0], D - half_size[0])
- image2d = image[0, dc, :, :]
- mask2d = np.zeros_like(image2d)
- mask2d[half_size[1]:H+1-half_size[1], half_size[2]:W+1-half_size[2]] = \
- np.ones([H-self.crop_size[1]+1, W-self.crop_size[2]+1])
- if('label' in sample):
- temp_mask = sample['label'][0, dc, :, :] > 0
- mask2d = temp_mask * mask2d
- elif(self.threshold is not None):
- temp_mask = image2d > self.threshold
- se = np.ones([3,3])
- temp_mask = ndimage.binary_opening(temp_mask, se, iterations = 2)
- temp_mask = get_largest_k_components(temp_mask, 1)
- mask2d = temp_mask * mask2d
-
- indices = np.where(mask2d)
- n = random.randint(0, len(indices[0])-1)
- center = [indices[i][n] for i in range(2)]
- crop_min = [dc - half_size[0], center[0]-half_size[1], center[1] - half_size[2]]
- crop_max = [crop_min[i] + self.crop_size[i] for i in range(input_dim)]
- crop_min = [0] + crop_min
- crop_max = [C] + crop_max
- x = crop_ND_volume_with_bounding_box(image, crop_min, crop_max)
-
- flip_axis = []
- if(random.random() > 0.5):
- flip_axis.append(-1)
- if(random.random() > 0.5):
- flip_axis.append(-2)
- if(random.random() > 0.5):
- flip_axis.append(-3)
- if(len(flip_axis) > 0):
- x = np.flip(x, flip_axis).copy()
-
- if(x.shape[1] == 63):
- print("crop shape == 63", x.shape)
- print(sample['names'])
- print(image.shape, crop_min, crop_max)
- return x
\ No newline at end of file
diff --git a/pymic/transform/normalize.py b/pymic/transform/normalize.py
deleted file mode 100644
index 35c5dc4..0000000
--- a/pymic/transform/normalize.py
+++ /dev/null
@@ -1,167 +0,0 @@
-import json
-import math
-import random
-import numpy as np
-from scipy import ndimage
-from pymic.transform.abstract_transform import AbstractTransform
-from pymic.util.image_process import *
-
-
-class NormalizeWithMeanStd(AbstractTransform):
- """
- Normalize the image based on mean and std. The image should have a shape
- of [C, D, H, W] or [C, H, W].
-
- The arguments should be written in the `params` dictionary, and it has the
- following fields:
-
- :param `NormalizeWithMeanStd_channels`: (list/tuple or None)
- A list or tuple of int for specifying the channels.
- If None, the transform operates on all the channels.
- :param `NormalizeWithMeanStd_mean`: (list/tuple or None)
- The mean values along each specified channel.
- If None, the mean values are calculated automatically.
- :param `NormalizeWithMeanStd_std`: (list/tuple or None)
- The std values along each specified channel.
- If None, the std values are calculated automatically.
- :param `NormalizeWithMeanStd_mask_threshold`: (optional, float)
- Only used when mean and std are not given. Default is 1.0.
- Calculate mean and std in the mask region where the intensity is higher than the mask.
- :param `NormalizeWithMeanStd_set_background_to_random`: (optional, bool)
- Set background region to random or not, and only applicable when
- `NormalizeWithMeanStd_mask_threshold` is not None. Default is True.
- :param `NormalizeWithMeanStd_inverse`: (optional, bool)
- Is inverse transform needed for inference. Default is `False`.
- """
- def __init__(self, params):
- super(NormalizeWithMeanStd, self).__init__(params)
- self.chns = params.get('NormalizeWithMeanStd_channels'.lower(), None)
- self.mean = params.get('NormalizeWithMeanStd_mean'.lower(), None)
- self.std = params.get('NormalizeWithMeanStd_std'.lower(), None)
- self.mask_thrd = params.get('NormalizeWithMeanStd_mask_threshold'.lower(), None)
- self.bg_random = params.get('NormalizeWithMeanStd_set_background_to_random'.lower(), True)
- self.inverse = params.get('NormalizeWithMeanStd_inverse'.lower(), False)
-
- def __call__(self, sample):
- image= sample['image']
- if(self.chns is None):
- self.chns = range(image.shape[0])
- if(self.mean is None):
- self.mean = [None] * len(self.chns)
- self.std = [None] * len(self.chns)
-
- for i in range(len(self.chns)):
- chn = self.chns[i]
- chn_mean, chn_std = self.mean[i], self.std[i]
- if(chn_mean is None):
- if(self.mask_thrd is not None):
- pixels = image[chn][image[chn] > self.mask_thrd]
- if(len(pixels) > 0):
- chn_mean, chn_std = pixels.mean(), pixels.std() + 1e-5
- else:
- chn_mean, chn_std = 0.0, 1.0
- else:
- chn_mean, chn_std = image[chn].mean(), image[chn].std() + 1e-5
-
- chn_norm = (image[chn] - chn_mean)/chn_std
-
- if(self.mask_thrd is not None and self.bg_random):
- chn_random = np.random.normal(0, 1, size = chn_norm.shape)
- chn_norm[image[chn] <= self.mask_thrd] = chn_random[image[chn] <=self.mask_thrd]
- image[chn] = chn_norm
- sample['image'] = image
- return sample
-
-
-class NormalizeWithMinMax(AbstractTransform):
- """Nomralize the image to [-1, 1]. The shape should be [C, D, H, W] or [C, H, W].
-
- The arguments should be written in the `params` dictionary, and it has the
- following fields:
-
- :param `NormalizeWithMinMax_channels`: (list/tuple or None)
- A list or tuple of int for specifying the channels.
- If None, the transform operates on all the channels.
- :param `NormalizeWithMinMax_threshold_lower`: (list/tuple or None)
- The min values along each specified channel.
- If None, the min values are calculated automatically.
- :param `NormalizeWithMinMax_threshold_upper`: (list/tuple or None)
- The max values along each specified channel.
- If None, the max values are calculated automatically.
- :param `NormalizeWithMinMax_inverse`: (optional, bool)
- Is inverse transform needed for inference. Default is `False`.
- """
- def __init__(self, params):
- super(NormalizeWithMinMax, self).__init__(params)
- self.chns = params['NormalizeWithMinMax_channels'.lower()]
- self.thred_lower = params['NormalizeWithMinMax_threshold_lower'.lower()]
- self.thred_upper = params['NormalizeWithMinMax_threshold_upper'.lower()]
- self.inverse = params.get('NormalizeWithMinMax_inverse'.lower(), False)
-
- def __call__(self, sample):
- image= sample['image']
- chns = self.chns if self.chns is not None else range(image.shape[0])
- for i in range(len(chns)):
- chn = chns[i]
- img_chn = image[chn]
- v0, v1 = img_chn.min(), img_chn.max()
- if(self.thred_lower is not None) and (self.thred_lower[i] is not None):
- v0 = self.thred_lower[i]
- if(self.thred_upper is not None) and (self.thred_upper[i] is not None):
- v1 = self.thred_upper[i]
-
- img_chn[img_chn < v0] = v0
- img_chn[img_chn > v1] = v1
- img_chn = 2.0* (img_chn - v0) / (v1 - v0) -1.0
- image[chn] = img_chn
- sample['image'] = image
- return sample
-
-class NormalizeWithPercentiles(AbstractTransform):
- """Nomralize the image to [-1, 1] with percentiles for given channels.
- The shape should be [C, D, H, W] or [C, H, W].
-
- The arguments should be written in the `params` dictionary, and it has the
- following fields:
-
- :param `NormalizeWithPercentiles_channels`: (list/tuple or None)
- A list or tuple of int for specifying the channels.
- If None, the transform operates on all the channels.
- :param `NormalizeWithPercentiles_percentile_lower`: (float)
- The min percentile, which must be between 0 and 100 inclusive.
- :param `NormalizeWithPercentiles_percentile_upper`: (float)
- The max percentile, which must be between 0 and 100 inclusive.
- :param `NormalizeWithPercentiles_output_mode`: (int) 0: the output is in the range [0,1]
- Otherwise the output is in the range of [-1, 1]
- :param `NormalizeWithMinMax_inverse`: (optional, bool)
- Is inverse transform needed for inference. Default is `False`.
- """
- def __init__(self, params):
- super(NormalizeWithPercentiles, self).__init__(params)
- self.chns = params.get('NormalizeWithPercentiles_channels'.lower(), None)
- self.percent_lower = params.get('NormalizeWithPercentiles_percentile_lower'.lower(), 0.1)
- self.percent_upper = params.get('NormalizeWithPercentiles_percentile_upper'.lower(), 99.9)
- self.out_mode = params.get('NormalizeWithPercentiles_output_mode'.lower(), 0)
- self.inverse = params.get('NormalizeWithPercentiles_inverse'.lower(), False)
-
- def __call__(self, sample):
- image= sample['image']
- chns = self.chns if self.chns is not None else range(image.shape[0])
- for i in range(len(chns)):
- chn = chns[i]
- img_chn = image[chn]
- v0 = np.percentile(img_chn, self.percent_lower)
- v1 = np.percentile(img_chn, self.percent_upper)
-
- img_chn[img_chn < v0] = v0
- img_chn[img_chn > v1] = v1
- if(self.out_mode == 0):
- img_chn = (img_chn - v0) / (v1 - v0)
- img_chn = np.clip(img_chn, 0, 1)
- else:
- img_chn = 2.0* (img_chn - v0) / (v1 - v0) -1.0
- img_chn = np.clip(img_chn, -1, 1)
-
- image[chn] = img_chn
- sample['image'] = image
- return sample
\ No newline at end of file
diff --git a/pymic/transform/pad.py b/pymic/transform/pad.py
deleted file mode 100644
index 509643d..0000000
--- a/pymic/transform/pad.py
+++ /dev/null
@@ -1,106 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-
-import torch
-import json
-import math
-import random
-import numpy as np
-from pymic import TaskType
-from pymic.transform.abstract_transform import AbstractTransform
-from pymic.util.image_process import *
-
-
-class Pad(AbstractTransform):
- """
- Pad an image to an new spatial shape.
- The image has a shape of [C, D, H, W] or [C, H, W].
- The real output size will be max(image_size, output_size).
-
- The arguments should be written in the `params` dictionary, and it has the
- following fields:
-
- :param `Pad_output_size`: (list/tuple) The output size along each spatial axis.
- :param `Pad_ceil_mode`: (optional, bool) If true, the real output size will
- be the minimal integer multiples of output_size higher than the input size.
- For example, the input image has a shape of [3, 100, 100], `Pad_output_size`
- = [32, 32], and the real output size will be [3, 128, 128] if `Pad_ceil_mode` = True.
- :param `Pad_inverse`: (optional, bool)
- Is inverse transform needed for inference. Default is `True`.
- """
- def __init__(self, params):
- super(Pad, self).__init__(params)
- self.output_size = params['Pad_output_size'.lower()]
- self.ceil_mode = params.get('Pad_ceil_mode'.lower(), False)
- self.inverse = params.get('Pad_inverse'.lower(), True)
-
- def __call__(self, sample):
- image = sample['image']
- input_shape = image.shape
- input_dim = len(input_shape) - 1
-
- if(input_dim == 3):
- if(len(self.output_size) == 2):
- # for 3D images, igore the z-axis
- self.output_size = [input_shape[1]] + list(self.output_size)
- assert(len(self.output_size) == input_dim)
- if(self.ceil_mode):
- multiple = [int(math.ceil(float(input_shape[1+i])/self.output_size[i]))\
- for i in range(input_dim)]
- output_size = [multiple[i] * self.output_size[i] \
- for i in range(input_dim)]
- else:
- output_size = self.output_size
- margin = [max(0, output_size[i] - input_shape[1+i]) \
- for i in range(input_dim)]
-
- margin_lower = [int(margin[i] / 2) for i in range(input_dim)]
- margin_upper = [margin[i] - margin_lower[i] for i in range(input_dim)]
- sample['Pad_Param'] = json.dumps((margin_lower, margin_upper))
-
- pad = [(margin_lower[i], margin_upper[i]) for i in range(input_dim)]
- pad = tuple([(0, 0)] + pad)
- image_t = np.pad(image, pad, 'reflect') if(max(margin) > 0) else image
-
- sample['image'] = image_t
-
- if('label' in sample and \
- self.task in [TaskType.SEGMENTATION, TaskType.RECONSTRUCTION]):
- label = sample['label']
- label = np.pad(label, pad, 'reflect') if(max(margin) > 0) else label
- sample['label'] = label
- if('pixel_weight' in sample and \
- self.task in [TaskType.SEGMENTATION, TaskType.RECONSTRUCTION]):
- weight = sample['pixel_weight']
- weight = np.pad(weight, pad, 'reflect') if(max(margin) > 0) else weight
- sample['pixel_weight'] = weight
- return sample
-
- def inverse_transform_for_prediction(self, sample):
- if(isinstance(sample['Pad_Param'], list) or isinstance(sample['Pad_Param'], tuple)):
- params = json.loads(sample['Pad_Param'][0])
- else:
- params = json.loads(sample['Pad_Param'])
- margin_lower = params[0]
- margin_upper = params[1]
- predict = sample['predict']
- if(isinstance(predict, tuple) or isinstance(predict, list)):
- output_predict = []
- for predict_i in predict:
- predict_shape = predict_i.shape
- crop_min = [0, 0] + margin_lower
- crop_max = [predict_shape[2:][i] - margin_upper[i] \
- for i in range(len(margin_lower))]
- crop_max = list(predict_shape[:2]) + crop_max
- crop_predict = crop_ND_volume_with_bounding_box(predict_i, crop_min, crop_max)
- output_predict.append(crop_predict)
- else:
- predict_shape = predict.shape
- crop_min = [0, 0] + margin_lower
- crop_max = [predict_shape[2:][i] - margin_upper[i] \
- for i in range(len(margin_lower))]
- crop_max = list(predict_shape[:2]) + crop_max
-
- output_predict = crop_ND_volume_with_bounding_box(predict, crop_min, crop_max)
- sample['predict'] = output_predict
- return sample
\ No newline at end of file
diff --git a/pymic/transform/rescale.py b/pymic/transform/rescale.py
deleted file mode 100644
index ba519c7..0000000
--- a/pymic/transform/rescale.py
+++ /dev/null
@@ -1,241 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-
-import json
-import random
-import numpy as np
-from scipy import ndimage
-from pymic import TaskType
-from pymic.transform.abstract_transform import AbstractTransform
-from pymic.util.image_process import *
-
-
-class Rescale(AbstractTransform):
- """Rescale the image to a given size.
-
- The arguments should be written in the `params` dictionary, and it has the
- following fields:
-
- :param `Rescale_output_size`: (list/tuple or int) The output size along each spatial axis,
- such as [D, H, W] or [H, W]. For 3D images, if D is None, or the lenght of tuple/list is 2,
- the input image is only reslcaled in 2D. If int, the smallest axis is matched to output_size
- keeping aspect ratio the same as the input.
- :param `Rescale_inverse`: (optional, bool)
- Is inverse transform needed for inference. Default is `True`.
- """
- def __init__(self, params):
- super(Rescale, self).__init__(params)
- self.output_size = params["Rescale_output_size".lower()]
- self.inverse = params.get("Rescale_inverse".lower(), True)
- assert isinstance(self.output_size, (int, list, tuple))
-
- def __call__(self, sample):
- image = sample['image']
- input_shape = image.shape
- input_dim = len(input_shape) - 1
-
- if isinstance(self.output_size, (list, tuple)):
- output_size = self.output_size
- if(output_size[0] is None):
- output_size[0] = input_shape[1]
- if(input_dim == 3 and len(self.output_size) == 2):
- output_size = [input_shape[1]] + list(output_size)
- assert(len(output_size) == input_dim)
- else:
- min_edge = min(input_shape[1:])
- output_size = [self.output_size * input_shape[i+1] / min_edge for \
- i in range(input_dim)]
- scale = [(output_size[i] + 0.0)/input_shape[1:][i] for i in range(input_dim)]
- scale = [1.0] + scale
- image_t = ndimage.interpolation.zoom(image, scale, order = 1)
-
- sample['image'] = image_t
- sample['Rescale_origin_shape'] = json.dumps(input_shape)
- if('label' in sample and \
- self.task in [TaskType.SEGMENTATION, TaskType.RECONSTRUCTION]):
- label = sample['label']
- label = ndimage.interpolation.zoom(label, scale, order = 0)
- sample['label'] = label
- if('pixel_weight' in sample and \
- self.task in [TaskType.SEGMENTATION, TaskType.RECONSTRUCTION]):
- weight = sample['pixel_weight']
- weight = ndimage.interpolation.zoom(weight, scale, order = 1)
- sample['pixel_weight'] = weight
-
- return sample
-
- def inverse_transform_for_prediction(self, sample):
- if(isinstance(sample['Rescale_origin_shape'], list) or \
- isinstance(sample['Rescale_origin_shape'], tuple)):
- origin_shape = json.loads(sample['Rescale_origin_shape'][0])
- else:
- origin_shape = json.loads(sample['Rescale_origin_shape'])
- origin_dim = len(origin_shape) - 1
- predict = sample['predict']
-
- if(isinstance(predict, tuple) or isinstance(predict, list)):
- output_predict = []
- for predict_i in predict:
- input_shape = predict_i.shape
- scale = [(origin_shape[1:][i] + 0.0)/input_shape[2:][i] for \
- i in range(origin_dim)]
- scale = [1.0, 1.0] + scale
- output_predict_i = ndimage.interpolation.zoom(predict_i, scale, order = 1)
- output_predict.append(output_predict_i)
- else:
- input_shape = predict.shape
- scale = [(origin_shape[1:][i] + 0.0)/input_shape[2:][i] for \
- i in range(origin_dim)]
- scale = [1.0, 1.0] + scale
- output_predict = ndimage.interpolation.zoom(predict, scale, order = 1)
- sample['predict'] = output_predict
- return sample
-
-class RandomRescale(AbstractTransform):
- """
- Rescale the input image randomly along each spatial axis.
-
- The arguments should be written in the `params` dictionary, and it has the
- following fields:
-
- :param `RandomRescale_lower_bound`: (list/tuple or float)
- Desired minimal rescale ratio. If tuple/list, the length should be 3 or 2.
- :param `RandomRescale_upper_bound`: (list/tuple or float)
- Desired maximal rescale ratio. If tuple/list, the length should be 3 or 2.
- :param `RandomRescale_probability`: (optional, float)
- The probability of applying RandomRescale. Default is 0.5.
- :param `RandomRescale_inverse`: (optional, bool)
- Is inverse transform needed for inference. Default is `True`.
- """
- def __init__(self, params):
- super(RandomRescale, self).__init__(params)
- self.ratio0 = params["RandomRescale_lower_bound".lower()]
- self.ratio1 = params["RandomRescale_upper_bound".lower()]
- self.prob = params.get('RandomRescale_probability'.lower(), 0.5)
- self.inverse = params.get("RandomRescale_inverse".lower(), False)
- assert isinstance(self.ratio0, (float, list, tuple))
- assert isinstance(self.ratio1, (float, list, tuple))
-
- def __call__(self, sample):
-
- image = sample['image']
- input_shape = image.shape
- input_dim = len(input_shape) - 1
- assert(input_dim == len(self.ratio0) and input_dim == len(self.ratio1))
-
- if isinstance(self.ratio0, (list, tuple)):
- for i in range(input_dim):
- if(self.ratio0[i] is None):
- self.ratio0[i] = 1.0
- if(self.ratio1[i] is None):
- self.ratio1[i] = 1.0
- assert(self.ratio0[i] <= self.ratio1[i])
- scale = [self.ratio0[i] + random.random()*(self.ratio1[i] - self.ratio0[i]) \
- for i in range(input_dim)]
- else:
- scale = self.ratio0 + random.random()*(self.ratio1 - self.ratio0)
- scale = [scale] * input_dim
- scale = [1.0] + scale
- image_t = ndimage.interpolation.zoom(image, scale, order = 1)
-
- sample['image'] = image_t
- sample['RandomRescale_Param'] = json.dumps(input_shape)
- if('label' in sample and \
- self.task in [TaskType.SEGMENTATION, TaskType.RECONSTRUCTION]):
- label = sample['label']
- label = ndimage.interpolation.zoom(label, scale, order = 0)
- sample['label'] = label
- if('pixel_weight' in sample and \
- self.task in [TaskType.SEGMENTATION, TaskType.RECONSTRUCTION]):
- weight = sample['pixel_weight']
- weight = ndimage.interpolation.zoom(weight, scale, order = 1)
- sample['pixel_weight'] = weight
-
- return sample
-
- def inverse_transform_for_prediction(self, sample):
- if(isinstance(sample['RandomRescale_Param'], list) or \
- isinstance(sample['RandomRescale_Param'], tuple)):
- origin_shape = json.loads(sample['RandomRescale_Param'][0])
- else:
- origin_shape = json.loads(sample['RandomRescale_Param'])
- origin_dim = len(origin_shape) - 1
- predict = sample['predict']
- input_shape = predict.shape
- scale = [(origin_shape[1:][i] + 0.0)/input_shape[2:][i] for \
- i in range(origin_dim)]
- scale = [1.0, 1.0] + scale
-
- output_predict = ndimage.interpolation.zoom(predict, scale, order = 1)
- sample['predict'] = output_predict
- return sample
-
-
-class Resample(Rescale):
- """Resample the image to a given spatial resolution.
-
- The arguments should be written in the `params` dictionary, and it has the
- following fields:
-
- :param `Resample_output_spacing`: (list/tuple or int) The output spacing along each spatial axis,
- such as [Ds, Hs, Ws] or [Hs, Ws]. If Ds is None, the input image is only reslcaled in 2D.
- :param `Resample_ignore_zspacing_range`: (list/tuple) The range of zspacing that would be ingored.
- :param `Resample_inverse`: (optional, bool)
- Is inverse transform needed for inference. Default is `True`.
- """
- def __init__(self, params):
- super(Rescale, self).__init__(params)
- self.output_spacing = params["Resample_output_spacing".lower()]
- self.ignore_zspacing= params.get("Resample_ignore_zspacing_range".lower(), None)
- self.inverse = params.get("Resample_inverse".lower(), True)
-
- def __call__(self, sample):
- image = sample['image']
- input_shape = image.shape
-
- input_dim = len(input_shape) - 1
- spacing = sample['spacing']
- out_spacing = [item for item in self.output_spacing]
- for i in range(input_dim):
- out_spacing[i] = spacing[i] if out_spacing[i] is None else out_spacing[i]
- if(self.ignore_zspacing is not None):
- if(spacing[0] > self.ignore_zspacing[0] and spacing[0] < self.ignore_zspacing[1]):
- out_spacing[0] = spacing[0]
- scale = [spacing[i] / out_spacing[i] for i in range(input_dim)]
- scale = [1.0] + scale
-
- image_t = ndimage.interpolation.zoom(image, scale, order = 1)
-
- sample['image'] = image_t
- sample['spacing'] = out_spacing
- sample['Resample_origin_shape'] = json.dumps(input_shape)
- if('label' in sample and \
- self.task in [TaskType.SEGMENTATION, TaskType.RECONSTRUCTION]):
- label = sample['label']
- label = ndimage.interpolation.zoom(label, scale, order = 0)
- sample['label'] = label
- if('pixel_weight' in sample and \
- self.task in [TaskType.SEGMENTATION, TaskType.RECONSTRUCTION]):
- weight = sample['pixel_weight']
- weight = ndimage.interpolation.zoom(weight, scale, order = 1)
- sample['pixel_weight'] = weight
-
- return sample
-
- def inverse_transform_for_prediction(self, sample):
- if(isinstance(sample['Resample_origin_shape'], list) or \
- isinstance(sample['Resample_origin_shape'], tuple)):
- origin_shape = json.loads(sample['Resample_origin_shape'][0])
- else:
- origin_shape = json.loads(sample['Resample_origin_shape'])
-
- origin_dim = len(origin_shape) - 1
- predict = sample['predict']
- input_shape = predict.shape
- scale = [(origin_shape[1:][i] + 0.0)/input_shape[2:][i] for \
- i in range(origin_dim)]
- scale = [1.0, 1.0] + scale
-
- output_predict = ndimage.interpolation.zoom(predict, scale, order = 1)
- sample['predict'] = output_predict
- return sample
\ No newline at end of file
diff --git a/pymic/transform/rotate.py b/pymic/transform/rotate.py
deleted file mode 100644
index 5de77d7..0000000
--- a/pymic/transform/rotate.py
+++ /dev/null
@@ -1,145 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-
-import json
-import random
-import numpy as np
-from scipy import ndimage
-from pymic import TaskType
-from pymic.transform.abstract_transform import AbstractTransform
-from pymic.util.image_process import *
-
-
-class RandomRotate(AbstractTransform):
- """
- Random rotate an image, wiht a shape of [C, D, H, W] or [C, H, W].
-
- The arguments should be written in the `params` dictionary, and it has the
- following fields:
-
- :param `RandomRotate_angle_range_d`: (list/tuple or None)
- Rotation angle (degree) range along depth axis (x-y plane), e.g., (-90, 90).
- If None, no rotation along this axis.
- :param `RandomRotate_angle_range_h`: (list/tuple or None)
- Rotation angle (degree) range along height axis (x-z plane), e.g., (-90, 90).
- If None, no rotation along this axis. Only used for 3D images.
- :param `RandomRotate_angle_range_w`: (list/tuple or None)
- Rotation angle (degree) range along width axis (y-z plane), e.g., (-90, 90).
- If None, no rotation along this axis. Only used for 3D images.
- :param `RandomRotate_probability`: (optional, float)
- The probability of applying RandomRotate. Default is 0.5.
- :param `RandomRotate_inverse`: (optional, bool)
- Is inverse transform needed for inference. Default is `True`.
- """
- def __init__(self, params):
- super(RandomRotate, self).__init__(params)
- self.angle_range_d = params['RandomRotate_angle_range_d'.lower()]
- self.angle_range_h = params.get('RandomRotate_angle_range_h'.lower(), None)
- self.angle_range_w = params.get('RandomRotate_angle_range_w'.lower(), None)
- self.prob = params.get('RandomRotate_probability'.lower(), 0.5)
- self.inverse = params.get('RandomRotate_inverse'.lower(), True)
-
- def __apply_transformation(self, image, transform_param_list, order = 1):
- """
- Apply rotation transformation to an ND image.
-
- :param image: The input ND image.
- :param transform_param_list: (list) A list of roration angle and axes.
- :param order: (int) Interpolation order.
- """
- for angle, axes in transform_param_list:
- image = ndimage.rotate(image, angle, axes, reshape = False, order = order)
- return image
-
- def __call__(self, sample):
- image = sample['image']
- input_shape = image.shape
- input_dim = len(input_shape) - 1
-
- transform_param_list = []
- if(self.angle_range_d is not None):
- angle_d = np.random.uniform(self.angle_range_d[0], self.angle_range_d[1])
- transform_param_list.append([angle_d, (-1, -2)])
- if(input_dim == 3):
- if(self.angle_range_h is not None):
- angle_h = np.random.uniform(self.angle_range_h[0], self.angle_range_h[1])
- transform_param_list.append([angle_h, (-1, -3)])
- if(self.angle_range_w is not None):
- angle_w = np.random.uniform(self.angle_range_w[0], self.angle_range_w[1])
- transform_param_list.append([angle_w, (-2, -3)])
- assert(len(transform_param_list) > 0)
- # select a random transform from the possible list rather than
- # use a combination for higher efficiency
- transform_param_list = [random.choice(transform_param_list)]
- sample['RandomRotate_Param'] = json.dumps(transform_param_list)
- image_t = self.__apply_transformation(image, transform_param_list, 1)
- sample['image'] = image_t
- if('label' in sample and \
- self.task in [TaskType.SEGMENTATION, TaskType.RECONSTRUCTION]):
- sample['label'] = self.__apply_transformation(sample['label'] ,
- transform_param_list, 0)
- if('pixel_weight' in sample and \
- self.task in [TaskType.SEGMENTATION, TaskType.RECONSTRUCTION]):
- sample['pixel_weight'] = self.__apply_transformation(sample['pixel_weight'] ,
- transform_param_list, 1)
- return sample
-
- def inverse_transform_for_prediction(self, sample):
- if(not sample['RandomRotate_triggered']):
- return sample
- if(isinstance(sample['RandomRotate_Param'], list) or \
- isinstance(sample['RandomRotate_Param'], tuple)):
- transform_param_list = json.loads(sample['RandomRotate_Param'][0])
- else:
- transform_param_list = json.loads(sample['RandomRotate_Param'])
- transform_param_list.reverse()
- for i in range(len(transform_param_list)):
- transform_param_list[i][0] = - transform_param_list[i][0]
- sample['predict'] = self.__apply_transformation(sample['predict'] ,
- transform_param_list, 1)
- return sample
-
-class RandomRot90(AbstractTransform):
- """
- Random rotate an image in x-y plane with angles in [90, 180, 270].
-
- The arguments should be written in the `params` dictionary, and it has the
- following fields:
-
- :param `RandomRot90_probability`: (optional, float)
- The probability of applying RandomRot90. Default is 0.75.
- :param `RandomRot90_inverse`: (optional, bool)
- Is inverse transform needed for inference. Default is `True`.
- """
- def __init__(self, params):
- super(RandomRot90, self).__init__(params)
- self.prob = params.get('RandomRot90_probability'.lower(), 0.75)
- self.inverse = params.get('RandomRot90_inverse'.lower(), True)
-
- def __call__(self, sample):
- if(random.random() > self.prob):
- sample['RandomRot90_triggered'] = False
- sample['RandomRot90_Param'] = 0
- return sample
- else:
- sample['RandomRot90_triggered'] = True
- image = sample['image']
- rote_k = random.randint(1, 3)
- sample['RandomRot90_Param'] = rote_k
- image_t = np.rot90(image, rote_k, (-2, -1))
- sample['image'] = image_t
- if('label' in sample and \
- self.task in [TaskType.SEGMENTATION, TaskType.RECONSTRUCTION]):
- sample['label'] = np.rot90(sample['label'], rote_k, (-2, -1))
- if('pixel_weight' in sample and \
- self.task in [TaskType.SEGMENTATION, TaskType.RECONSTRUCTION]):
- sample['pixel_weight'] = np.rot90(sample['pixel_weight'], rote_k, (-2, -1))
- return sample
-
- def inverse_transform_for_prediction(self, sample):
- if(not sample['RandomRot90_triggered']):
- return sample
- rote_k = sample['RandomRot90_Param']
- rote_i = 4 - rote_k
- sample['predict'] = np.rot90(sample['predict'], rote_i, (-2, -1))
- return sample
\ No newline at end of file
diff --git a/pymic/transform/threshold.py b/pymic/transform/threshold.py
deleted file mode 100644
index 11e6d0e..0000000
--- a/pymic/transform/threshold.py
+++ /dev/null
@@ -1,132 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-
-import torch
-import json
-import math
-import random
-import numpy as np
-from scipy import ndimage
-from pymic.transform.abstract_transform import AbstractTransform
-from pymic.util.image_process import *
-
-
-class ChannelWiseThreshold(AbstractTransform):
- """
- Thresholding the image for given channels.
-
- The arguments should be written in the `params` dictionary, and it has the
- following fields:
-
- :param `ChannelWiseThreshold_channels`: (list/tuple or None)
- A list of specified channels for thresholding. If None (by default),
- all the channels will be thresholded.
- :param `ChannelWiseThreshold_threshold_lower`: (list/tuple or None)
- The lower threshold for the given channels.
- :param `ChannelWiseThreshold_threshold_upper`: (list/tuple or None)
- The upper threshold for the given channels.
- :param `ChannelWiseThreshold_replace_lower`: (list/tuple or None)
- The output value for pixels with an input value lower than the threshold_lower.
- :param `ChannelWiseThreshold_replace_upper`: (list/tuple or None)
- The output value for pixels with an input value higher than the threshold_upper.
- :param `ChannelWiseThreshold_inverse`: (optional, bool)
- Is inverse transform needed for inference. Default is `False`.
- """
- def __init__(self, params):
- super(ChannelWiseThreshold, self).__init__(params)
- self.channels = params['ChannelWiseThreshold_channels'.lower()]
- self.threshold_lower = params['ChannelWiseThreshold_threshold_lower'.lower()]
- self.threshold_upper = params['ChannelWiseThreshold_threshold_upper'.lower()]
- self.replace_lower = params['ChannelWiseThreshold_replace_lower'.lower()]
- self.replace_upper = params['ChannelWiseThreshold_replace_upper'.lower()]
- self.inverse = params.get('ChannelWiseThreshold_inverse'.lower(), False)
-
- def __call__(self, sample):
- image= sample['image']
- channels = range(image.shape[0]) if self.channels is None else self.channels
- for i in range(len(channels)):
- chn = channels[i]
- if((self.threshold_lower is not None) and (self.threshold_lower[i] is not None)):
- t_lower = self.threshold_lower[i]
- r_lower = self.threshold_lower[i]
- if((self.replace_lower is not None) and (self.replace_lower[i] is not None)):
- r_lower = self.replace_lower[i]
- image[chn][image[chn] < t_lower] = r_lower
-
- if((self.threshold_upper is not None) and (self.threshold_upper[i] is not None)):
- t_upper = self.threshold_upper[i]
- r_upper = self.threshold_upper[i]
- if((self.replace_upper is not None) and (self.replace_upper[i] is not None)):
- r_upper= self.replace_upper[i]
- image[chn][image[chn] > t_upper] = r_upper
- sample['image'] = image
- return sample
-
-class ChannelWiseThresholdWithNormalize(AbstractTransform):
- """
- Apply thresholding and normalization for given channels.
- Pixel intensity will be truncated to the range of (lower, upper) and then
- normalized. If mean_std_mode is True, the mean and std values for pixel
- in the target range is calculated for normalization, and input intensity
- outside that range will be replaced by random values. Otherwise, the intensity
- will be normalized to [0, 1].
-
- The arguments should be written in the `params` dictionary, and it has the
- following fields:
-
- :param `ChannelWiseThresholdWithNormalize_channels`: (list/tuple or None)
- A list of specified channels for thresholding. If None (by default),
- all the channels will be affected by this transform.
- :param `ChannelWiseThresholdWithNormalize_threshold_lower`: (list/tuple or None)
- The lower threshold for the given channels.
- :param `ChannelWiseThresholdWithNormalize_threshold_upper`: (list/tuple or None)
- The upper threshold for the given channels.
- :param `ChannelWiseThresholdWithNormalize_mean_std_mode`: (bool)
- If True, using mean and std for normalization. If False, using min and max
- values for normalization.
- :param `ChannelWiseThresholdWithNormalize_inverse`: (optional, bool)
- Is inverse transform needed for inference. Default is `False`.
- """
- def __init__(self, params):
- super(ChannelWiseThresholdWithNormalize, self).__init__(params)
- self.channels = params['ChannelWiseThresholdWithNormalize_channels'.lower()]
- self.threshold_lower = params['ChannelWiseThresholdWithNormalize_threshold_lower'.lower()]
- self.threshold_upper = params['ChannelWiseThresholdWithNormalize_threshold_upper'.lower()]
- self.mean_std_mode = params['ChannelWiseThresholdWithNormalize_mean_std_mode'.lower()]
- self.inverse = params.get('ChannelWiseThresholdWithNormalize_inverse'.lower(), False)
-
- def __call__(self, sample):
- image= sample['image']
- channels = range(image.shape[0]) if self.channels is None else self.channels
- for chn in channels:
- v0 = self.threshold_lower[chn]
- v1 = self.threshold_upper[chn]
- if(self.mean_std_mode == True):
- mask = np.ones_like(image[chn])
- if(v0 is not None):
- mask = mask * np.asarray(image[chn] > v0)
- if(v1 is not None):
- mask = mask * np.asarray(image[chn] < v1)
- pixels = image[chn][mask > 0]
- chn_mean = pixels.mean()
- chn_std = pixels.std()
- chn_norm = (image[chn] - chn_mean)/chn_std
- chn_random = np.random.normal(0, 1, size = chn_norm.shape)
- chn_norm[mask == 0] = chn_random[mask == 0]
- image[chn] = chn_norm
- else:
- img_chn = image[chn]
- if(v0 is not None):
- img_chn[img_chn < v0] = v0
- min_value = v0
- else:
- min_value = img_chn.min()
- if(v1 is not None):
- img_chn[img_chn > v1] = v1
- max_value = img_chn.max()
- else:
- max_value = img_chn.max()
- img_chn = (img_chn - min_value) / (max_value - min_value)
- image[chn] = img_chn
- sample['image'] = image
- return sample
\ No newline at end of file
diff --git a/pymic/transform/trans_dict.py b/pymic/transform/trans_dict.py
deleted file mode 100644
index 9c11bba..0000000
--- a/pymic/transform/trans_dict.py
+++ /dev/null
@@ -1,107 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-The built-in transforms in PyMIC are:
-
-.. code-block:: none
-
- 'ChannelWiseThreshold': ChannelWiseThreshold,
- 'ChannelWiseThresholdWithNormalize': ChannelWiseThresholdWithNormalize,
- 'CropWithBoundingBox': CropWithBoundingBox,
- 'CenterCrop': CenterCrop,
- 'GrayscaleToRGB': GrayscaleToRGB,
- 'GammaCorrection': GammaCorrection,
- 'GaussianNoise': GaussianNoise,
- 'LabelConvert': LabelConvert,
- 'LabelSelect': LabelSelect,
- 'LabelConvertNonzero': LabelConvertNonzero,
- 'LabelToProbability': LabelToProbability,
- 'IntensityClip': IntensityClip,
- 'NonLinearTransform': NonLinearTransform,
- 'NormalizeWithMeanStd': NormalizeWithMeanStd,
- 'NormalizeWithMinMax': NormalizeWithMinMax,
- 'NormalizeWithPercentiles': NormalizeWithPercentiles,
- 'PartialLabelToProbability':PartialLabelToProbability,
- 'RandomCrop': RandomCrop,
- 'RandomResizedCrop': RandomResizedCrop,
- 'RandomRescale': RandomRescale,
- 'RandomFlip': RandomFlip,
- 'RandomRotate': RandomRotate,
- 'RandomRot90': RandomRot90,
- 'ReduceLabelDim': ReduceLabelDim,
- 'Rescale': Rescale,
- 'SelfSuperviseLabel': SelfSuperviseLabel,
- 'Pad': Pad.
-
-"""
-from __future__ import print_function, division
-from pymic.transform.affine import *
-from pymic.transform.intensity import *
-from pymic.transform.flip import *
-from pymic.transform.pad import *
-from pymic.transform.rotate import *
-from pymic.transform.rescale import *
-from pymic.transform.transpose import *
-from pymic.transform.threshold import *
-from pymic.transform.normalize import *
-from pymic.transform.crop import *
-from pymic.transform.crop4dino import Crop4Dino
-from pymic.transform.crop4voco import Crop4VoCo
-from pymic.transform.crop4vox2vec import Crop4Vox2Vec
-from pymic.transform.crop4voxMMSD import Crop4VoxMMSD
-from pymic.transform.crop4vf import Crop4VolumeFusion, VolumeFusion, VolumeFusionShuffle
-from pymic.transform.label_convert import *
-
-TransformDict = {
- 'Affine': Affine,
- 'AdaptiveContrastAdjust': AdaptiveContrastAdjust,
- 'BrightnessAdditive': BrightnessAdditive,
- 'BrightnessMultiplicative': BrightnessMultiplicative,
- 'ChannelWiseThreshold': ChannelWiseThreshold,
- 'ChannelWiseThresholdWithNormalize': ChannelWiseThresholdWithNormalize,
- 'CropWithBoundingBox': CropWithBoundingBox,
- 'CropWithForeground': CropWithForeground,
- 'CropHumanRegion': CropHumanRegion,
- 'CenterCrop': CenterCrop,
- 'Crop4Dino': Crop4Dino,
- 'Crop4VoCo': Crop4VoCo,
- 'Crop4Vox2Vec': Crop4Vox2Vec,
- 'Crop4VoxMMSD': Crop4VoxMMSD,
- 'Crop4VolumeFusion': Crop4VolumeFusion,
- 'GrayscaleToRGB': GrayscaleToRGB,
- 'GammaCorrection': GammaCorrection,
- 'GaussianNoise': GaussianNoise,
- 'GaussianBlur': GaussianBlur,
- 'HistEqual': HistEqual,
- 'InPainting': InPainting,
- 'InOutPainting': InOutPainting,
- 'LabelConvert': LabelConvert,
- 'LabelSelect': LabelSelect,
- 'LabelConvertNonzero': LabelConvertNonzero,
- 'LabelToProbability': LabelToProbability,
- 'LocalShuffling': LocalShuffling,
- 'IntensityClip': IntensityClip,
- 'MaskedImageModeling': MaskedImageModeling,
- 'NonLinearTransform': NonLinearTransform,
- 'NormalizeWithMeanStd': NormalizeWithMeanStd,
- 'NormalizeWithMinMax': NormalizeWithMinMax,
- 'NormalizeWithPercentiles': NormalizeWithPercentiles,
- 'PartialLabelToProbability':PartialLabelToProbability,
- 'RandomCrop': RandomCrop,
- 'RandomSlice': RandomSlice,
- 'RandomResizedCrop': RandomResizedCrop,
- 'RandomRescale': RandomRescale,
- 'RandomTranspose': RandomTranspose,
- 'RandomFlip': RandomFlip,
- 'RandomRotate': RandomRotate,
- 'RandomRot90': RandomRot90,
- 'ReduceLabelDim': ReduceLabelDim,
- 'Rescale': Rescale,
- 'Resample': Resample,
- 'SelfReconstructionLabel': SelfReconstructionLabel,
- 'MaskedImageModelingLabel': MaskedImageModelingLabel,
- 'OutPainting': OutPainting,
- 'Pad': Pad,
- 'PatchSwaping':PatchSwaping,
- 'VolumeFusion': VolumeFusion,
- 'VolumeFusionShuffle': VolumeFusionShuffle
-}
diff --git a/pymic/transform/transpose.py b/pymic/transform/transpose.py
deleted file mode 100644
index 6f5d5fa..0000000
--- a/pymic/transform/transpose.py
+++ /dev/null
@@ -1,59 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-
-import json
-import random
-import numpy as np
-from pymic import TaskType
-from pymic.transform.abstract_transform import AbstractTransform
-
-
-class RandomTranspose(AbstractTransform):
- """
- Random transpose for 3D volumes. Assume the input has a shape of [C, D, H, W], the
- output shape will be of [C, D, H, W], [C, W, H, D] or [C, H, D, W]
-
- The arguments should be written in the `params` dictionary, and it has the
- following fields:
-
- :param `RandomTranspose_inverse`: (optional, bool)
- Is inverse transform needed for inference. Default is `True`.
- """
- def __init__(self, params):
- super(RandomTranspose, self).__init__(params)
- self.inverse = params.get('RandomTranspose_inverse'.lower(), True)
-
- def __call__(self, sample):
- image = sample['image']
- input_shape = image.shape
- input_dim = len(input_shape) - 1
- assert(input_dim == 3)
-
- rand_num = random.random()
- if(rand_num < 0.4):
- transpose_axis = None
- elif(rand_num < 0.7):
- transpose_axis = [0, 3, 2, 1]
- else:
- transpose_axis = [0, 2, 1, 3]
- sample['RandomTranspose_Param'] = json.dumps(transpose_axis)
- if(transpose_axis is not None):
- image_t = np.transpose(image, transpose_axis)
- sample['image'] = image_t
- if('label' in sample and \
- self.task in [TaskType.SEGMENTATION, TaskType.RECONSTRUCTION]):
- sample['label'] = np.transpose(sample['label'] , transpose_axis)
- if('pixel_weight' in sample and \
- self.task in [TaskType.SEGMENTATION, TaskType.RECONSTRUCTION]):
- sample['pixel_weight'] = np.transpose(sample['pixel_weight'] , transpose_axis)
- return sample
-
- def inverse_transform_for_prediction(self, sample):
- if(isinstance(sample['RandomTranspose_Param'], list) or \
- isinstance(sample['RandomTranspose_Param'], tuple)):
- transpose_axis = json.loads(sample['RandomTranspose_Param'][0])
- else:
- transpose_axis = json.loads(sample['RandomTranspose_Param'])
- if(transpose_axis is not None):
- sample['predict'] = np.transpose(sample['predict'] , transpose_axis)
- return sample
\ No newline at end of file
diff --git a/pymic/util/__init__.py b/pymic/util/__init__.py
deleted file mode 100644
index 72b8078..0000000
--- a/pymic/util/__init__.py
+++ /dev/null
@@ -1,2 +0,0 @@
-from __future__ import absolute_import
-from . import *
\ No newline at end of file
diff --git a/pymic/util/evaluation_cls.py b/pymic/util/evaluation_cls.py
deleted file mode 100644
index 686a811..0000000
--- a/pymic/util/evaluation_cls.py
+++ /dev/null
@@ -1,202 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-Evaluation module for classification tasks.
-"""
-from __future__ import absolute_import, print_function
-import argparse
-import os
-import csv
-import sys
-import math
-import pandas as pd
-import random
-import configparser
-import numpy as np
-import sklearn.metrics as metrics
-from scipy import ndimage
-from pymic.io.image_read_write import *
-from pymic.util.image_process import *
-from pymic.util.parse_config import parse_config
-
-def accuracy(gt_label, pred_label):
- """
- Calculate the accuracy.
- """
- correct_pred = gt_label == pred_label
- acc = (correct_pred.sum() + 0.0 ) / len(gt_label)
- return acc
-
-def sensitivity(gt_label, pred_label):
- """
- Calculate the sensitivity for binary prediction.
- """
- pos_pred = gt_label * pred_label
- senst = (pos_pred.sum() + 0.0) / gt_label.sum()
- return senst
-
-def specificity(gt_label, pred_label):
- """
- Calculate the specificity for binary prediction.
- """
- gt_label = 1 - gt_label
- pred_label = 1 - pred_label
- neg_pred = gt_label * pred_label
- spec = (neg_pred.sum() + 0.0) / gt_label.sum()
- return spec
-
-def get_evaluation_score(gt_label, pred_prob, metric):
- """
- Get an evaluation score for binary classification.
-
- :param gt_label: (array) Ground truth label.
- :param pred_prob: (array) Predicted positive probability.
- :param metric: (str) One of the evaluation metrics in
- {`accuracy`, `recall`, `sensitivity`, `specificity`,
- `precision`, `auc`}.
- """
- pred_lab = np.argmax(pred_prob, axis = 1)
- if(metric == "accuracy"):
- score = metrics.accuracy_score(gt_label, pred_lab)
- elif(metric == "recall" or metric == "sensitivity"):
- score = metrics.recall_score(gt_label, pred_lab)
- elif(metric == "specificity"):
- score = metrics.recall_score(1 - gt_label, 1 - pred_lab)
- elif(metric == "precision"):
- score = metrics.precision_score(gt_label, pred_lab)
- elif(metric == "auc"):
- score = metrics.roc_auc_score(gt_label, pred_prob[:,1])
- else:
- raise ValueError("undefined metric: {0:}".format(metric))
- return score
-
-def binary_evaluation(config):
- """
- Evaluation of binary classification performance.
- The arguments are given in the `config` dictionary.
- It should have the following fields:
-
- :param metric: (list) A list of evaluation metrics.
- The supported metrics are {`accuracy`, `recall`, `sensitivity`, `specificity`,
- `precision`, `auc`}.
- :param gt_csv: (str) The csv file for ground truth.
- :param pred_prob_csv: (str) The csv file for prediction probability.
- """
- metric_list = config['metric']
- gt_csv = config['gt_csv']
- prob_csv= config['pred_prob_csv']
- gt_items = pd.read_csv(gt_csv)
- prob_items = pd.read_csv(prob_csv)
- assert(len(gt_items) == len(prob_items))
- for i in range(len(gt_items)):
- assert(gt_items.iloc[i, 0] == prob_items.iloc[i, 0])
-
- gt_data = np.asarray(gt_items.iloc[:, -1])
- prob_data = np.asarray(prob_items.iloc[:, 1:])
- score_list = []
- for metric in metric_list:
- score = get_evaluation_score(gt_data, prob_data, metric)
- score_list.append(score)
- print("{0:}: {1:}".format(metric, score))
-
- out_csv = prob_csv.replace("prob", "eval")
- with open(out_csv, mode='w') as csv_file:
- csv_writer = csv.writer(csv_file, delimiter=',',
- quotechar='"',quoting=csv.QUOTE_MINIMAL)
- csv_writer.writerow(metric_list)
- csv_writer.writerow(score_list)
-
-def nexcl_evaluation(config):
- """
- Evaluation of non-exclusive binary classification performance.
- The arguments are given in the `config` dictionary.
- It should have the following fields:
-
- :param metric: (list) A list of evaluation metrics.
- The supported metrics are {`accuracy`, `recall`, `sensitivity`, `specificity`,
- `precision`, `auc`}.
- :param gt_csv: (str) The csv file for ground truth.
- :param pred_prob_csv: (str) The csv file for prediction probability.
- """
- metric_list = config['metric']
- gt_csv = config['gt_csv']
- prob_csv = config['pred_prob_csv']
- gt_items = pd.read_csv(gt_csv)
- prob_items= pd.read_csv(prob_csv)
- assert(len(gt_items) == len(prob_items))
- for i in range(len(gt_items)):
- assert(gt_items.iloc[i, 0] == prob_items.iloc[i, 0])
-
- cls_names = gt_items.columns[1:]
- cls_num = len(cls_names)
- gt_data = np.asarray(gt_items.iloc[:, 1:cls_num + 1])
- prob_data = np.asarray(prob_items.iloc[:, 1:cls_num + 1])
- score_list= []
- for metric in metric_list:
- print(metric)
- score_m = []
- for c in range(cls_num):
- gt_data_c = gt_data[:, c:c+1]
- prob_c = prob_data[:, c]
- prob_c = np.asarray([1.0 - prob_c, prob_c])
- prob_c = np.transpose(prob_c)
- score = get_evaluation_score(gt_data_c, prob_c, metric)
- score_m.append(score)
- print(cls_names[c], score)
- score_avg = np.asarray(score_m).mean()
- print('avg', score_avg)
- score_m.append(score_avg)
- score_list.append(score_m)
-
- out_csv = prob_csv.replace("prob", "eval")
- with open(out_csv, mode='w') as csv_file:
- csv_writer = csv.writer(csv_file, delimiter=',',
- quotechar='"',quoting=csv.QUOTE_MINIMAL)
- csv_writer.writerow(['metric'] + list(cls_names) + ['avg'])
- for i in range(len(score_list)):
- item = metric_list[i : i+1] + score_list[i]
- csv_writer.writerow(item)
-
-def main():
- """
- Main function for evaluation of classification results.
- A configuration file is needed for runing. e.g.,
-
- .. code-block:: none
-
- pymic_evaluate_cls -cfg config.cfg
-
- The configuration file should have an `evaluation` section with
- the following fields:
-
- :param task_type: (str) `cls` or `cls_nexcl`.
- :param metric: (list) A list of evaluation metrics.
- The supported metrics are {`accuracy`, `recall`, `sensitivity`, `specificity`,
- `precision`, `auc`}.
- :param gt_csv: (str) The csv file for ground truth.
- :param pred_prob_csv: (str) The csv file for prediction probability.
- """
- parser = argparse.ArgumentParser()
- parser.add_argument("--cfg", help="configuration file for evaluation",
- required=False, default=None)
- parser.add_argument("--metric", help="evaluation metrics, e.g., accuracy, or [accuracy, auc]",
- required=False, default=None)
- parser.add_argument("--gt_csv", help="csv file for ground truth",
- required=False, default=None)
- parser.add_argument("--pred_prob_csv", help="csv file for probability prediction",
- required=False, default=None)
- args = parser.parse_args()
- print(args)
- if(args.cfg is not None):
- config = parse_config(args)['evaluation']
-
- # config_file = str(sys.argv[1])
- # assert(os.path.isfile(config_file))
- # config = parse_config(config_file)['evaluation']
- task_type = config.get('task_type', "cls")
- if(task_type == "cls"): # default exclusive classification
- binary_evaluation(config)
- else: # non exclusive classification
- nexcl_evaluation(config)
-
-if __name__ == '__main__':
- main()
diff --git a/pymic/util/evaluation_seg.py b/pymic/util/evaluation_seg.py
deleted file mode 100644
index a381f94..0000000
--- a/pymic/util/evaluation_seg.py
+++ /dev/null
@@ -1,414 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-Evaluation module for segmenation tasks.
-"""
-from __future__ import absolute_import, print_function
-import argparse
-import csv
-import os
-import sys
-import pandas as pd
-import numpy as np
-from os.path import join
-from scipy import ndimage
-from pymic.io.image_read_write import *
-from pymic.util.image_process import *
-from pymic.util.general import is_image_name
-from pymic.util.parse_config import parse_config, parse_value_from_string
-
-
-
-def binary_dice(s, g, resize = False):
- """
- Calculate the Dice score of two N-d volumes for binary segmentation.
-
- :param s: The segmentation volume of numpy array.
- :param g: the ground truth volume of numpy array.
- :param resize: (optional, bool)
- If s and g have different shapes, resize s to match g.
- Default is `True`.
-
- :return: The Dice value.
- """
- assert(len(s.shape)== len(g.shape))
- if(resize):
- size_match = True
- for i in range(len(s.shape)):
- if(s.shape[i] != g.shape[i]):
- size_match = False
- break
- if(size_match is False):
- s = resize_ND_volume_to_given_shape(s, g.shape, order = 0)
- prod = np.multiply(s, g)
- s0 = prod.sum()
- s1 = s.sum()
- s2 = g.sum()
- dice = (2.0*s0 + 1e-5)/(s1 + s2 + 1e-5)
- return dice
-
-def dice_of_images(s_name, g_name):
- """
- Calculate the Dice score given the image names of binary segmentation
- and ground truth, respectively.
-
- :param s_name: (str) The filename of segmentation result.
- :param g_name: (str) The filename of ground truth.
-
- :return: The Dice value.
- """
- s = load_image_as_nd_array(s_name)['data_array']
- g = load_image_as_nd_array(g_name)['data_array']
- dice = binary_dice(s, g)
- return dice
-
-
-def binary_iou(s,g):
- """
- Calculate the IoU score of two N-d volumes for binary segmentation.
-
- :param s: The segmentation volume of numpy array.
- :param g: the ground truth volume of numpy array.
-
- :return: The IoU value.
- """
- assert(len(s.shape)== len(g.shape))
- intersecion = np.multiply(s, g)
- union = np.asarray(s + g >0, np.float32)
- iou = (intersecion.sum() + 1e-5)/(union.sum() + 1e-5)
- return iou
-
-# Hausdorff and ASSD evaluation
-def get_edge_points(img):
- """
- Get edge points of a binary segmentation result.
-
- :param img: (numpy.array) a 2D or 3D array of binary segmentation.
- :return: an edge map.
- """
- dim = len(img.shape)
- if(dim == 2):
- strt = ndimage.generate_binary_structure(2,1)
- else:
- strt = ndimage.generate_binary_structure(3,1)
- ero = ndimage.binary_erosion(img, strt)
- edge = np.asarray(img, np.uint8) - np.asarray(ero, np.uint8)
- return edge
-
-
-def binary_hd95(s, g, spacing = None):
- """
- Get the 95 percentile of hausdorff distance between a binary segmentation
- and the ground truth.
-
- :param s: (numpy.array) a 2D or 3D binary image for segmentation.
- :param g: (numpy.array) a 2D or 2D binary image for ground truth.
- :param spacing: (list) A list for image spacing, length should be 2 or 3.
-
- :return: The HD95 value.
- """
- s_edge = get_edge_points(s)
- g_edge = get_edge_points(g)
- ns = s_edge.sum()
- ng = g_edge.sum()
- if(ns + ng == 0):
- hd95 = 0.0
- elif(ns * ng == 0):
- hd95 = 100.0
- else:
- image_dim = len(s.shape)
- assert(image_dim == len(g.shape))
- if(spacing == None):
- spacing = [1.0] * image_dim
- else:
- assert(image_dim == len(spacing))
- s_dis = ndimage.distance_transform_edt(1-s_edge, sampling = spacing)
- g_dis = ndimage.distance_transform_edt(1-g_edge, sampling = spacing)
-
- dist_list1 = s_dis[g_edge > 0]
- dist_list1 = sorted(dist_list1)
- dist1 = dist_list1[int(len(dist_list1)*0.95)]
- dist_list2 = g_dis[s_edge > 0]
- dist_list2 = sorted(dist_list2)
- dist2 = dist_list2[int(len(dist_list2)*0.95)]
- hd95 = max(dist1, dist2)
- return hd95
-
-
-def binary_assd(s, g, spacing = None):
- """
- Get the Average Symetric Surface Distance (ASSD) between a binary segmentation
- and the ground truth.
-
- :param s: (numpy.array) a 2D or 3D binary image for segmentation.
- :param g: (numpy.array) a 2D or 2D binary image for ground truth.
- :param spacing: (list) A list for image spacing, length should be 2 or 3.
-
- :return: The ASSD value.
- """
- s_edge = get_edge_points(s)
- g_edge = get_edge_points(g)
- image_dim = len(s.shape)
- assert(image_dim == len(g.shape))
- if(spacing == None):
- spacing = [1.0] * image_dim
- else:
- assert(image_dim == len(spacing))
- s_dis = ndimage.distance_transform_edt(1-s_edge, sampling = spacing)
- g_dis = ndimage.distance_transform_edt(1-g_edge, sampling = spacing)
-
- ns = s_edge.sum()
- ng = g_edge.sum()
- if(ns + ng == 0):
- assd = 0.0
- elif(ns*ng == 0):
- assd = 20.0
- else:
- s_dis_g_edge = s_dis * g_edge
- g_dis_s_edge = g_dis * s_edge
- assd = (s_dis_g_edge.sum() + g_dis_s_edge.sum()) / (ns + ng)
- return assd
-
-# relative volume error evaluation
-def binary_relative_volume_error(s, g):
- """
- Get the Relative Volume Error (RVE) between a binary segmentation
- and the ground truth.
-
- :param s: (numpy.array) a 2D or 3D binary image for segmentation.
- :param g: (numpy.array) a 2D or 2D binary image for ground truth.
-
- :return: The RVE value.
- """
- s_v = float(s.sum())
- g_v = float(g.sum())
- assert(g_v > 0)
- rve = abs(s_v - g_v)/g_v
- return rve
-
-def get_binary_evaluation_score(s_volume, g_volume, spacing, metric):
- """
- Evaluate the performance of binary segmentation using a specified metric.
- The metric options are {`dice`, `iou`, `assd`, `hd95`, `rve`, `volume`}.
-
- :param s_volume: (numpy.array) a 2D or 3D binary image for segmentation.
- :param g_volume: (numpy.array) a 2D or 2D binary image for ground truth.
- :param spacing: (list) A list for image spacing, length should be 2 or 3.
- :param metric: (str) The metric name.
-
- :return: The metric value.
- """
- if(len(s_volume.shape) == 4):
- assert(s_volume.shape[0] == 1 and g_volume.shape[0] == 1)
- s_volume = np.reshape(s_volume, s_volume.shape[1:])
- g_volume = np.reshape(g_volume, g_volume.shape[1:])
- if(s_volume.shape[0] == 1):
- s_volume = np.reshape(s_volume, s_volume.shape[1:])
- g_volume = np.reshape(g_volume, g_volume.shape[1:])
- metric_lower = metric.lower()
-
- if(metric_lower == "dice"):
- score = binary_dice(s_volume, g_volume)
- elif(metric_lower == "iou"):
- score = binary_iou(s_volume,g_volume)
- elif(metric_lower == 'assd'):
- score = binary_assd(s_volume, g_volume, spacing)
- score = min(score, 20) # to reject outliers
- elif(metric_lower == "hd95"):
- score = binary_hd95(s_volume, g_volume, spacing)
- score = min(score, 50) # to reject outliers
- elif(metric_lower == "rve"):
- score = binary_relative_volume_error(s_volume, g_volume)
- elif(metric_lower == "volume"):
- voxel_size = 1.0
- for dim in range(len(spacing)):
- voxel_size = voxel_size * spacing[dim]
- score = g_volume.sum()*voxel_size
- else:
- raise ValueError("unsupported evaluation metric: {0:}".format(metric))
-
- return score
-
-def get_class_evaluation_score(s_volume, g_volume, label, spacing, metric):
- """
- Evaluate the segmentation performance using a specified metric for a list of labels.
- The metric options are {`dice`, `iou`, `assd`, `hd95`, `rve`, `volume`}.
- If `label` is a list, the labels in that list will be merged as a foreground.
-
- :param s_volume: (numpy.array) A 2D or 3D image for segmentation.
- :param g_volume: (numpy.array) A 2D or 2D image for ground truth.
- :param label: (list/int) A list of target labels or an int for a single class.
- :param fuse_label: (bool) Fuse the labels in `label_list` or not.
- :param spacing: (list) A list for image spacing, length should be 2 or 3.
- :param metric: (str) The metric name.
-
- :return: The metric value list.
- """
- if(isinstance(label, list)):
- s_volume_sub = np.zeros_like(s_volume)
- g_volume_sub = np.zeros_like(g_volume)
- for lab in label:
- s_volume_sub = s_volume_sub + np.asarray(s_volume == lab, np.uint8)
- g_volume_sub = g_volume_sub + np.asarray(g_volume == lab, np.uint8)
- s_volume = np.asarray(s_volume_sub > 0, np.uint8)
- g_volume = np.asarray(g_volume_sub > 0, np.uint8)
- label = 1
- score = get_binary_evaluation_score(s_volume == label, g_volume == label,
- spacing, metric)
- return score
-
-def evaluation(config):
- """
- Run evaluation of segmentation results based on a configuration dictionary `config`.
- The following fields should be provided in `config`:
-
- :param metric_list: (list) The list of metrics for evaluation.
- The metric options are {`dice`, `iou`, `assd`, `hd95`, `rve`, `volume`}.
- :param label_list: (list) The list of labels for evaluation.
- :param label_fuse: (option, bool) If true, fuse the labels in the `label_list`
- as the foreground, and other labels as the background. Default is False.
- :param class_name_list: (str) The list of class names.
- :param ground_truth_folder: (str) The root dir of ground truth images.
- :param segmentation_folder: (str or list) The root dir of segmentation images.
- When a list is given, each list element should be the root dir of the results of one method.
- :param evaluation_image_pair: (str) The csv file that provide the segmentation
- images and the corresponding ground truth images.
- """
-
- metric_list = config['metric_list']
- label_list = config.get('label_list', None)
- cls_name_list = config.get('class_name_list', None)
- if(not isinstance(metric_list, list)):
- metric_list = [metric_list]
-
- if(label_list is None):
- label_list = range(1, config["class_number"])
- elif(not isinstance(label_list, list)):
- label_list = [label_list]
-
- if(cls_name_list is None):
- cls_name_list = []
- for lab in label_list:
- if(isinstance(lab, list)):
- class_name = "class_" + "_".join([str(item) for item in lab])
- else:
- class_name = str(lab)
- cls_name_list.append(class_name)
-
- output_name = config.get('output_name', None)
- gt_dir = config['ground_truth_folder']
- seg_dirs = config['segmentation_folder']
- image_pair_csv = config.get('evaluation_image_pair', None)
-
- if(not isinstance(seg_dirs, (tuple, list))):
- seg_dirs = [seg_dirs]
- if(image_pair_csv is not None):
- image_pair = pd.read_csv(image_pair_csv)
- gt_names, seg_names = image_pair.iloc[:, 0], image_pair.iloc[:, 1]
- else:
- seg_names = sorted(os.listdir(seg_dirs[0]))
- seg_names = [item for item in seg_names if is_image_name(item)]
- gt_names = seg_names
-
- for seg_dir in seg_dirs:
- for metric in metric_list:
- print(metric)
- score_all_data = []
- name_score_list= []
- for i in range(len(gt_names)):
- gt_full_name = join(gt_dir, gt_names[i])
- seg_full_name = join(seg_dir, seg_names[i])
- s_dict = load_image_as_nd_array(seg_full_name)
- g_dict = load_image_as_nd_array(gt_full_name)
- s_volume = s_dict["data_array"]; s_spacing = s_dict["spacing"]
- g_volume = g_dict["data_array"]; g_spacing = g_dict["spacing"]
- # for dim in range(len(s_spacing)):
- # assert(s_spacing[dim] == g_spacing[dim])
-
- score_vector = [get_class_evaluation_score(s_volume, g_volume, label_list[idx], s_spacing, metric) \
- for idx in range(len(label_list))]
- if(len(label_list) > 1):
- score_vector.append(np.asarray(score_vector).mean())
- score_all_data.append(score_vector)
- name_score_list.append([seg_names[i]] + score_vector)
- score_vector_str = [float(item) for item in score_vector]
- print(seg_names[i], score_vector_str)
- score_all_data = np.asarray(score_all_data)
- score_mean = score_all_data.mean(axis = 0)
- score_std = score_all_data.std(axis = 0)
- name_score_list.append(['mean'] + list(score_mean))
- name_score_list.append(['std'] + list(score_std))
-
- # save the result as csv
- if(output_name is None):
- metric_output_name = "{0:}/eval_{1:}.csv".format(seg_dir, metric)
- else:
- metric_output_name = output_name
- with open(metric_output_name, mode='w') as csv_file:
- csv_writer = csv.writer(csv_file, delimiter=',',
- quotechar='"',quoting=csv.QUOTE_MINIMAL)
- head = ['image'] + cls_name_list
- if(len(label_list) > 1):
- head = head + ["average"]
- csv_writer.writerow(head)
- for item in name_score_list:
- csv_writer.writerow(item)
-
- print("{0:} mean ".format(metric), score_mean)
- print("{0:} std ".format(metric), score_std)
-
-def main():
- """
- Main function for evaluation of segmentation results.
- You can use a configuration file for runing. e.g.,
-
- .. code-block:: none
-
- pymic_evaluate_seg -cfg config.cfg
-
- The configuration file should have an `evaluation` section.
- See :mod:`pymic.util.evaluation_seg.evaluation` for details of the configuration required.
-
- In addition, you can also provide a list of args in the command if -cfg is not used. For example:
-
- .. code-block:: none
-
- pymic_evaluate_seg -metric dice -cls_index 255 -gt_dir ground_truth_dir -seg_dir segmentation_dir
-
- """
- parser = argparse.ArgumentParser()
- parser.add_argument("--cfg", help="configuration file for evaluation",
- required=False, default=None)
- parser.add_argument("--metric", help="evaluation metrics, e.g., dice, or [dice, assd]",
- required=False, default=None)
- parser.add_argument("--cls_num", help="number of classes",
- required=False, default=None)
- parser.add_argument("--cls_index", help="The class index for evaluation, e.g., 255, [1, 2]",
- required=False, default=None)
- parser.add_argument("--gt_dir", help="path of folder for ground truth",
- required=False, default=None)
- parser.add_argument("--seg_dir", help="path of folder for segmentation",
- required=False, default=None)
- parser.add_argument("--name_pair", help="the .csv file for name mapping in case"
- " the names of one case are different in the gt_dir "
- " and seg_dir",
- required=False, default=None)
- parser.add_argument("--out", help="the output .csv file name",
- required=False, default=None)
- args = parser.parse_args()
- print(args)
- if(args.cfg is not None):
- config = parse_config(args)['evaluation']
- else:
- config = {}
- config['metric_list'] = parse_value_from_string(args.metric)
- config['label_list'] = None if args.cls_index is None else parse_value_from_string(args.cls_index)
- config['class_number']= None if args.cls_num is None else parse_value_from_string(args.cls_num)
- config['ground_truth_folder'] = args.gt_dir
- config['segmentation_folder'] = args.seg_dir
- config['evaluation_image_pair'] = args.name_pair
- config['output_name'] = args.out
- print(config)
- evaluation(config)
-
-if __name__ == '__main__':
- main()
diff --git a/pymic/util/general.py b/pymic/util/general.py
deleted file mode 100644
index cf52746..0000000
--- a/pymic/util/general.py
+++ /dev/null
@@ -1,107 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import print_function, division
-import torch
-import numpy as np
-
-def keyword_match(a,b):
- """
- Test if two string are the same when converted to lower case.
- """
- return a.lower() == b.lower()
-
-def tensor_shape_match(a,b):
- """
- Test if two tensors have the same shape"""
- shape_a = list(a.shape)
- shape_b = list(b.shape)
- len_a = len(shape_a)
- len_b = len(shape_b)
- if(len_a != len_b):
- return False
- elif(len_a == 0):
- return True
- else:
- for i in range(len_a):
- if(shape_a[i] != shape_b[i]):
- return False
- return True
-
-def is_image_name(x):
- valid_names = ["jpg", "jpeg", "png", "bmp", "nii.gz",
- "tif", "nii", "nii.gz", "mha"]
- valid = False
- for item in valid_names:
- if(x.endswith(item)):
- valid = True
- break
- return valid
-
-def get_one_hot_seg(label, class_num):
- """
- Convert a segmentation label to one-hot.
-
- :param label: A tensor with a shape of [N, 1, D, H, W] or [N, 1, H, W]
- :param class_num: Class number.
-
- :return: a one-hot tensor with a shape of [N, C, D, H, W] or [N, C, H, W].
- """
- size = list(label.size())
- if(size[1] != 1):
- raise ValueError("The channel should be 1, \
- rather than {0:} before one-hot encoding".format(size[1]))
- label = label.view(-1)
- ones = torch.sparse.torch.eye(class_num).to(label.device)
- one_hot = ones.index_select(0, label)
- size.append(class_num)
- one_hot = one_hot.view(*size)
- one_hot = torch.transpose(one_hot, 1, -1)
- one_hot = torch.squeeze(one_hot, -1)
- return one_hot
-
-def mixup(inputs, labels):
- """Shuffle a minibatch and do linear interpolation between images and labels.
- Both classification and segmentation labels are supported. The targets should
- be one-hot labels.
-
- :param inputs: a tensor of input images with size N X C0 x H x W.
- :param labels: a tensor of one-hot labels. The shape is N X C for classification
- tasks, and N X C X H X W for segmentation tasks.
- """
- input_shape = list(inputs.shape)
- label_shape = list(labels.shape)
- img_dim = len(input_shape) - 2
- N = input_shape[0] # batch size
- C = label_shape[1] # class number
- rp1 = torch.randperm(N)
- inputs1 = inputs[rp1]
- labels1 = labels[rp1]
-
- rp2 = torch.randperm(N)
- inputs2 = inputs[rp2]
- labels2 = labels[rp2]
-
- a = np.random.beta(1, 1, [N, 1])
- if(img_dim == 2):
- b = np.tile(a[..., None, None], [1] + input_shape[1:])
- elif(img_dim == 3):
- b = np.tile(a[..., None, None, None], [1] + input_shape[1:])
- else:
- raise ValueError("MixUp only supports 2D and 3D images, but the " +
- "input image has {0:} dimensions".format(img_dim))
-
- inputs1 = inputs1 * torch.from_numpy(b).float()
- inputs2 = inputs2 * torch.from_numpy(1 - b).float()
- inputs_mix = inputs1 + inputs2
-
- if(len(label_shape) == 2): # for classification tasks
- c = np.tile(a, [1, C])
- elif(img_dim == 2): # for 2D segmentation tasks
- c = np.tile(a[..., None, None], [1] + label_shape[1:])
- else: # for 3D segmentation tasks
- c = np.tile(a[..., None, None, None], [1] + label_shape[1:])
-
- labels1 = labels1 * torch.from_numpy(c).float()
- labels2 = labels2 * torch.from_numpy(1 - c).float()
- labels_mix = labels1 + labels2
-
- return inputs_mix, labels_mix
diff --git a/pymic/util/image_process.py b/pymic/util/image_process.py
deleted file mode 100644
index c31f28f..0000000
--- a/pymic/util/image_process.py
+++ /dev/null
@@ -1,443 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import absolute_import, print_function
-
-import csv
-import random
-import pandas as pd
-import numpy as np
-import SimpleITK as sitk
-from scipy import ndimage
-from pymic.io.image_read_write import load_image_as_nd_array
-
-def get_ND_bounding_box(volume, margin = None):
- """
- Get the bounding box of nonzero region in an ND volume.
-
- :param volume: An ND numpy array.
- :param margin: (list)
- The margin of bounding box along each axis.
-
- :return bb_min: (list) A list for the minimal value of each axis
- of the bounding box.
- :return bb_max: (list) A list for the maximal value of each axis
- of the bounding box.
- """
- input_shape = volume.shape
- if(margin is None):
- margin = [0] * len(input_shape)
- assert(len(input_shape) == len(margin))
- indxes = np.nonzero(volume)
- bb_min = []
- bb_max = []
- for i in range(len(input_shape)):
- bb_min.append(int(indxes[i].min()))
- bb_max.append(int(indxes[i].max()) + 1)
-
- for i in range(len(input_shape)):
- bb_min[i] = max(bb_min[i] - margin[i], 0)
- bb_max[i] = min(bb_max[i] + margin[i], input_shape[i])
- return bb_min, bb_max
-
-def get_human_region_from_ct(image, threshold_i = -600, threshold_z = 0.6):
- input_shape = image.shape
- mask = np.asarray(image > threshold_i)
- mask2d = np.mean(mask, axis = 0) > threshold_z
- se = np.ones([3,3])
- mask2d = ndimage.binary_opening(mask2d, se, iterations = 2)
- mask2d = get_largest_k_components(mask2d, 1)
- bbmin, bbmax = get_ND_bounding_box(mask2d, margin = [0, 0])
- bb_min = [0] + bbmin
- bb_max = list(input_shape[:1]) + bbmax
- return bb_min, bb_max
-
-def crop_ND_volume_with_bounding_box(volume, bb_min, bb_max):
- """
- Extract a subregion form an ND image.
-
- :param volume: The input ND array.
- :param bb_min: (list) The lower bound of the bounding box for each axis.
- :param bb_max: (list) The upper bound of the bounding box for each axis.
-
- :return: A croped ND image.
- """
- dim = len(volume.shape)
- assert(dim >= 2 and dim <= 5)
- assert(bb_max[0] - bb_min[0] <= volume.shape[0])
- if(dim == 2):
- output = volume[bb_min[0]:bb_max[0], bb_min[1]:bb_max[1]]
- elif(dim == 3):
- output = volume[bb_min[0]:bb_max[0], bb_min[1]:bb_max[1], bb_min[2]:bb_max[2]]
- elif(dim == 4):
- output = volume[bb_min[0]:bb_max[0], bb_min[1]:bb_max[1], bb_min[2]:bb_max[2], bb_min[3]:bb_max[3]]
- elif(dim == 5):
- output = volume[bb_min[0]:bb_max[0], bb_min[1]:bb_max[1], bb_min[2]:bb_max[2], bb_min[3]:bb_max[3], bb_min[4]:bb_max[4]]
- else:
- raise ValueError("the dimension number shoud be 2 to 5")
- return output * 1
-
-def set_ND_volume_roi_with_bounding_box_range(volume, bb_min, bb_max, sub_volume, addition = True):
- """
- Set the subregion of an ND image. If `addition` is `True`, the original volume is added by the given sub volume.
-
- :param volume: The input ND volume.
- :param bb_min: (list) The lower bound of the bounding box for each axis.
- :param bb_max: (list) The upper bound of the bounding box for each axis.
- :param sub_volume: The sub volume to replace the target region of the orginal volume.
- :param addition: (optional, bool) If True, the sub volume will be added
- to the target region of the input volume.
- """
- dim = len(bb_min)
- out = volume
- if(dim == 2):
- if(addition):
- out[bb_min[0]:bb_max[0], bb_min[1]:bb_max[1]] += sub_volume
- else:
- out[bb_min[0]:bb_max[0], bb_min[1]:bb_max[1]] = sub_volume
- elif(dim == 3):
- if(addition):
- out[bb_min[0]:bb_max[0], bb_min[1]:bb_max[1], bb_min[2]:bb_max[2]] += sub_volume
- else:
- out[bb_min[0]:bb_max[0], bb_min[1]:bb_max[1], bb_min[2]:bb_max[2]] = sub_volume
- elif(dim == 4):
- if(addition):
- out[bb_min[0]:bb_max[0], bb_min[1]:bb_max[1], bb_min[2]:bb_max[2], bb_min[3]:bb_max[3]] += sub_volume
- else:
- out[bb_min[0]:bb_max[0], bb_min[1]:bb_max[1], bb_min[2]:bb_max[2], bb_min[3]:bb_max[3]] = sub_volume
- elif(dim == 5):
- if(addition):
- out[bb_min[0]:bb_max[0], bb_min[1]:bb_max[1], bb_min[2]:bb_max[2], bb_min[3]:bb_max[3], bb_min[4]:bb_max[4]] += sub_volume
- else:
- out[bb_min[0]:bb_max[0], bb_min[1]:bb_max[1], bb_min[2]:bb_max[2], bb_min[3]:bb_max[3], bb_min[4]:bb_max[4]] = sub_volume
- else:
- raise ValueError("array dimension should be 2 to 5")
- return out
-
-def crop_and_pad_ND_array_to_desired_shape(image, out_shape, pad_mod='reflect'):
- """
- Crop and pad an image to a given shape.
-
- :param image: The input ND array.
- :param out_shape: (list) The desired output shape.
- :param pad_mod: (str) See `numpy.pad `_
- """
- in_shape = image.shape
- dim = len(in_shape)
- crop_shape = [min(out_shape[i], in_shape[i]) for i in range(dim)]
- mgnc = [max(0, in_shape[i] - crop_shape[i]) for i in range(dim)]
- if(max(mgnc) == 0):
- image_crp = image
- else:
- ml = [int(mgnc[i]/2) for i in range(dim)]
- mr = [mgnc[i] - ml[i] for i in range(dim)]
- if(dim == 2):
- image_crp = image[ml[0]:(in_shape[0] - mr[0]), ml[1]:(in_shape[1] - mr[1])]
- elif(dim == 3):
- image_crp = image[ml[0]:(in_shape[0] - mr[0]), ml[1]:(in_shape[1] - mr[1]), ml[2]:(in_shape[2] - mr[2])]
- elif(dim == 4):
- image_crp = image[ml[0]:(in_shape[0] - mr[0]), ml[1]:(in_shape[1] - mr[1]), ml[2]:(in_shape[2] - mr[2]), ml[3]:(in_shape[3] - mr[3])]
- elif(dim == 5):
- image_crp = image[ml[0]:(in_shape[0] - mr[0]), ml[1]:(in_shape[1] - mr[1]), ml[2]:(in_shape[2] - mr[2]), ml[3]:(in_shape[3] - mr[3]), ml[4]:(in_shape[4] - mr[4])]
- else:
- raise ValueError("array dimension should be 2 to 5")
-
- mgnp = [out_shape[i] - crop_shape[i] for i in range(dim)]
- if(max(mgnp) == 0):
- image_pad = image_crp
- else:
- ml = [int(mgnp[i]/2) for i in range(dim)]
- mr = [mgnp[i] - ml[i] for i in range(dim)]
- pad = [(ml[i], mr[i]) for i in range(dim)]
- pad = tuple(pad)
- image_pad = np.pad(image_crp, pad, pad_mod)
-
- return image_pad
-
-def random_crop_ND_volume(volume, out_shape):
- """
- randomly crop a volume with to a given shape.
-
- :param volume: The input ND array.
- :param out_shape: (list) The desired output shape.
- """
- in_shape = volume.shape
- dim = len(in_shape)
-
- # pad the image first if the input size is smaller than the output size
- pad_shape = [max(out_shape[i], in_shape[i]) for i in range(dim)]
- mgnp = [pad_shape[i] - in_shape[i] for i in range(dim)]
- if(max(mgnp) == 0):
- image_pad = volume
- else:
- ml = [int(mgnp[i]/2) for i in range(dim)]
- mr = [mgnp[i] - ml[i] for i in range(dim)]
- pad = [(ml[i], mr[i]) for i in range(dim)]
- pad = tuple(pad)
- image_pad = np.pad(volume, pad, 'reflect')
-
- bb_min = [random.randint(0, pad_shape[i] - out_shape[i]) for i in range(dim)]
- bb_max = [bb_min[i] + out_shape[i] for i in range(dim)]
- crop_volume = crop_ND_volume_with_bounding_box(image_pad, bb_min, bb_max)
- return crop_volume
-
-def get_random_box_from_mask(mask, out_shape, mode = 0):
- """
- get a bounding box of a subvolume according to a mask
-
- mode == 0: The output bounding box should be a sub region of the mask region
- mode == 1: The center point of the output bounding box can be ahy where of the mask region
- """
- dim = len(out_shape)
- left_margin = [int(out_shape[i]/2) for i in range(dim)]
- right_margin = [out_shape[i] - left_margin[i] for i in range(dim)]
-
- if(mode == 0):
- bb_mask_min, bb_mask_max = get_ND_bounding_box(mask)
- bb_valid_min, bb_valid_max = [], []
- for i in range(dim):
- mask_size = bb_mask_max[i] - bb_mask_min[i]
- if(mask_size > out_shape[i]):
- valid_left = bb_mask_min[i] + left_margin[i]
- valid_right = bb_mask_max[i] - right_margin[i]
- else:
- valid_left = (bb_mask_max[i] - bb_mask_min[i]) // 2
- valid_right = valid_left + 1
- bb_valid_min.append(valid_left)
- bb_valid_max.append(valid_right)
-
- valid_region_shape = [bb_valid_max[i] - bb_valid_min[i] for i in range(dim)]
- valid_mask = np.zeros_like(mask)
- valid_mask = set_ND_volume_roi_with_bounding_box_range(valid_mask,
- bb_valid_min, bb_valid_max, np.ones(valid_region_shape, np.bool), addition = True)
- valid_mask = valid_mask * mask
- else:
- valid_mask = mask
-
- indices = np.where(valid_mask)
- voxel_num = len(indices[0])
- j = random.randint(0, voxel_num - 1)
- bb_c = [int(indices[i][j]) for i in range(dim)]
- bb_min = [max(0, bb_c[i] - left_margin[i]) for i in range(dim)]
- mask_shape = np.shape(mask)
- bb_min = [min(bb_min[i], mask_shape[i] - out_shape[i]) for i in range(dim)]
- bb_max = [bb_min[i] + out_shape[i] for i in range(dim)]
-
- return bb_min, bb_max
-
-def random_crop_ND_volume_with_mask(volume, out_shape, mask):
- """
- randomly crop a volume with to a given shape.
-
- :param volume: The input ND array.
- :param out_shape: (list) The desired output shape.
- :param mask: A binary ND array. Default is None. If not None,
- the center of the cropped region should be limited to the mask region.
- """
- in_shape = volume.shape
- dim = len(in_shape)
- # pad the image first if the input size is smaller than the output size
- pad_shape = [max(out_shape[i], in_shape[i]) for i in range(dim)]
- mgnp = [pad_shape[i] - in_shape[i] for i in range(dim)]
- if(max(mgnp) == 0):
- image_pad, mask_pad = volume, mask
- else:
- ml = [int(mgnp[i]/2) for i in range(dim)]
- mr = [mgnp[i] - ml[i] for i in range(dim)]
- pad = [(ml[i], mr[i]) for i in range(dim)]
- pad = tuple(pad)
- image_pad = np.pad(volume, pad, 'reflect')
- mask_pad = np.pad(mask, pad, 'constant')
-
- bb_min, bb_max = get_random_box_from_mask(mask_pad, out_shape)
- # left_margin = [int(out_shape[i]/2) for i in range(dim)]
- # right_margin= [pad_shape[i] - (out_shape[i] - left_margin[i]) + 1 for i in range(dim)]
-
- # valid_center_shape = [right_margin[i] - left_margin[i] for i in range(dim)]
- # valid_mask = np.zeros(pad_shape)
- # valid_mask = set_ND_volume_roi_with_bounding_box_range(valid_mask,
- # left_margin, right_margin, np.ones(valid_center_shape))
- # valid_mask = valid_mask * mask_pad
-
- # indexes = np.where(valid_mask)
- # voxel_num = len(indexes[0])
- # j = random.randint(0, voxel_num)
- # bb_c = [indexes[i][j] for i in range(dim)]
- # bb_min = [bb_c[i] - left_margin[i] for i in range(dim)]
- # bb_max = [bb_min[i] + out_shape[i] for i in range(dim)]
- crop_volume = crop_ND_volume_with_bounding_box(image_pad, bb_min, bb_max)
- return crop_volume
-
-def get_largest_k_components(image, k = 1):
- """
- Get the largest K components from 2D or 3D binary image.
-
- :param image: The input ND array for binary segmentation.
- :param k: (int) The value of k.
-
- :return: An output array (k == 1) or a list of ND array (k>1)
- with only the largest K components of the input.
- """
- dim = len(image.shape)
- if(image.sum() == 0 ):
- print('the largest component is null')
- return image
- if(dim < 2 or dim > 3):
- raise ValueError("the dimension number should be 2 or 3")
- s = ndimage.generate_binary_structure(dim,1)
- labeled_array, numpatches = ndimage.label(image, s)
- sizes = ndimage.sum(image, labeled_array, range(1, numpatches + 1))
- sizes_sort = sorted(sizes, reverse = True)
- kmin = min(k, numpatches)
- output = []
- for i in range(kmin):
- labeli = np.where(sizes == sizes_sort[i])[0] + 1
- output_i = np.asarray(labeled_array == labeli, np.uint8)
- output.append(output_i)
- return output[0] if k == 1 else output
-
-def get_euclidean_distance(image, dim = 3, spacing = [1.0, 1.0, 1.0]):
- """
- Get euclidean distance transform of 3D binary images.
- The output distance map is unsigned.
-
- :param image: The input 3D array.
- :param dim: (int) Using 2D (dim = 2) or 3D (dim = 3) distance transforms.
- :param spacing: (list) The spacing along each axis.
-
- """
- img_shape = image.shape
- input_dim = len(img_shape)
- if(input_dim != 3):
- raise ValueError("Not implemented for {0:}D image".format(input_dim))
- if(dim == 2):
- raise ValueError("Not implemented for {0:}D image".format(input_dim))
- # dis_map = np.ones_like(image, np.float32)
- # for d in range(img_shape[0]):
- # if(image[d].sum() > 0):
- # dis_d = ndimage.morphology.distance_transform_edt(image[d])
- # dis_map[d] = dis_d/dis_d.max()
- elif(dim == 3):
- fg_dis_map = ndimage.morphology.distance_transform_edt(image > 0.5)
- bg_dis_map = ndimage.morphology.distance_transform_edt(image <= 0.5)
- dis_map = bg_dis_map - fg_dis_map
- else:
- raise ValueError("Not implemented for {0:}D distance".format(dim))
- return dis_map
-
-def convert_label(label, source_list, target_list):
- """
- Convert a label map based a source list and a target list of labels
-
- :param label: (numpy.array) The input label map.
- :param source_list: A list of labels that will be converted, e.g. [0, 1, 2, 4]
- :param target_list: A list of target labels, e.g. [0, 1, 2, 3]
- """
- assert(len(source_list) == len(target_list))
- label_converted = label * 1
- for i in range(len(source_list)):
- label_s = np.asarray(label == source_list[i], label.dtype)
- label_t = label_s * target_list[i]
- label_converted[label_s > 0] = label_t[label_s > 0]
- return label_converted
-
-def resample_sitk_image_to_given_spacing(image, spacing, order = 3):
- """
- Resample an sitk image objct to a given spacing.
-
- :param image: The input sitk image object.
- :param spacing: (list/tuple) Target spacing along x, y, z direction.
- :param order: (int) Order for interpolation.
-
- :return: A resampled sitk image object.
- """
- spacing0 = image.GetSpacing()
- data = sitk.GetArrayFromImage(image)
- zoom = [spacing0[i] / spacing[i] for i in range(3)]
- zoom = [zoom[2], zoom[0], zoom[1]]
- data = ndimage.interpolation.zoom(data, zoom, order = order)
- out_img = sitk.GetImageFromArray(data)
- out_img.SetSpacing(spacing)
- out_img.SetDirection(image.GetDirection())
- return out_img
-
-def get_image_info(img_names, output_csv = None):
- spacing_list, shape_list = [], []
- for img_name in img_names:
- img_obj = sitk.ReadImage(img_name)
- img_arr = sitk.GetArrayFromImage(img_obj)
- spacing = img_obj.GetSpacing()
- shape = img_arr.shape
- spacing_list.append(spacing)
- shape_list.append(shape)
- print(img_name, spacing, shape)
- spacings = np.asarray(spacing_list)
- shapes = np.asarray(shape_list)
- spacing_min = spacings.min(axis = 0)
- spacing_max = spacings.max(axis = 0)
- spacing_median = np.percentile(spacings, 50, axis = 0)
- print("spacing min", spacing_min)
- print("spacing max", spacing_max)
- print("spacing median", spacing_median)
-
- shape_min = shapes.min(axis = 0)
- shape_max = shapes.max(axis = 0)
- shape_median = np.percentile(shapes, 50, axis = 0)
- print("shape min", shape_min)
- print("shape max", shape_max)
- print("shape median", shape_median)
-
- if(output_csv is not None):
- img_names_short = [item.split("/")[-1] for item in img_names]
- img_names_short.extend(["spacing min", "spacing max", "spacing median",
- "shape min", "shape max", "shape median"])
- spacing_list.extend([spacing_min, spacing_max, spacing_median,
- shape_min, shape_max, shape_median])
- shape_list.extend(['']* 6)
- out_dict = {"img_name": img_names_short,
- "spacing": spacing_list,
- "shape": shape_list}
- df = pd.DataFrame.from_dict(out_dict)
- df.to_csv(output_csv, index=False)
-
-def get_average_mean_std(data_dir, data_csv):
- df = pd.read_csv(data_csv)
- mean_list, std_list = [], []
- for i in range(len(df)):
- img_name = data_dir + "/" + df.iloc[i, 0]
- lab_name = data_dir + "/" + df.iloc[i, 1]
- img = load_image_as_nd_array(img_name)["data_array"][0]
- lab = load_image_as_nd_array(lab_name)["data_array"][0]
- voxels = img[lab>0]
- mean = voxels.mean()
- std = voxels.std()
- mean_list.append(mean)
- std_list.append(std)
- print(img_name, mean, std)
- mean = np.asarray(mean_list).mean()
- std = np.asarray(std_list).mean()
- print("mean and std value", mean, std)
-
-def get_label_info(data_dir, label_csv, class_num):
- df = pd.read_csv(label_csv)
- size_list = []
- # mean_list, std_list = [], []
- num_no_tumor = 0
- for i in range(len(df)):
- lab_name = data_dir + "/" + df.iloc[i, 1]
- lab = load_image_as_nd_array(lab_name)["data_array"][0]
- size_per_class = []
- for c in range(1, class_num):
- labc = lab == c
- size_per_class.append(np.sum(labc))
- if(np.sum(labc) == 0):
- num_no_tumor = num_no_tumor + 1
- size_list.append(size_per_class)
- print(lab_name, size_per_class)
- size = np.asarray(size_list)
- size_min = size.min(axis = 0)
- size_max = size.max(axis = 0)
- size_mean = size.mean(axis = 0)
-
- print("size min", size_min)
- print("size max", size_max)
- print("size mean", size_mean)
- print("case number without tumor", num_no_tumor)
\ No newline at end of file
diff --git a/pymic/util/model_operate.py b/pymic/util/model_operate.py
deleted file mode 100644
index 9ba2eb3..0000000
--- a/pymic/util/model_operate.py
+++ /dev/null
@@ -1,40 +0,0 @@
-import torch
-
-
-def rename_model_variable(input_file, output_file, input_var_list, output_var_list):
- assert(len(input_var_list) == len(output_var_list))
- checkpoint = torch.load(input_file)
- state_dict = checkpoint['model_state_dict']
- for i in range(len(input_var_list)):
- input_var = input_var_list[i]
- output_var = output_var_list[i]
- state_dict[output_var] = state_dict[input_var]
- state_dict.pop(input_var)
- checkpoint['model_state_dict'] = state_dict
- torch.save(checkpoint, output_file)
-
-
-def get_average_model(checkpoint_name1, checkpoint_name2, checkpoint_name3, save_name):
- checkpoint1 = torch.load(checkpoint_name1)
- state_dict1 = checkpoint1['model_state_dict']
-
- checkpoint2 = torch.load(checkpoint_name2)
- state_dict2 = checkpoint2['model_state_dict']
-
- checkpoint3 = torch.load(checkpoint_name3)
- state_dict3 = checkpoint3['model_state_dict']
-
- state_dict = {}
- for item in state_dict1:
- print(item)
- state_dict[item] = (state_dict1[item] + state_dict2[item] + state_dict3[item])/3
-
- save_dict = {'model_state_dict': state_dict}
- torch.save(save_dict, save_name)
-
-if __name__ == "__main__":
- input_file = '/home/guotai/disk2t/projects/dlls/training_fetal_brain/exp1/model/unet2dres_bn1_20000.pt'
- output_file = '/home/guotai/disk2t/projects/dlls/training_fetal_brain/exp1/model/unet2dres_bn1_20000_rename.pt'
- input_var_list = ['conv.weight', 'conv.bias']
- output_var_list= ['conv9.weight', 'conv9.bias']
- rename_model_variable(input_file, output_file, input_var_list, output_var_list)
\ No newline at end of file
diff --git a/pymic/util/parse_config.py b/pymic/util/parse_config.py
deleted file mode 100644
index 525649e..0000000
--- a/pymic/util/parse_config.py
+++ /dev/null
@@ -1,207 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import absolute_import, print_function
-
-from pymic import TaskDict
-import configparser
-import logging
-
-def is_int(val_str):
- start_digit = 0
- if(val_str[0] =='-'):
- start_digit = 1
- flag = True
- for i in range(start_digit, len(val_str)):
- if(str(val_str[i]) < '0' or str(val_str[i]) > '9'):
- flag = False
- break
- return flag
-
-def is_float(val_str):
- flag = False
- if('.' in val_str and len(val_str.split('.'))==2 and not('./' in val_str)):
- if(is_int(val_str.split('.')[0]) and is_int(val_str.split('.')[1])):
- flag = True
- else:
- flag = False
- elif('e' in val_str and val_str[0] != 'e' and len(val_str.split('e'))==2):
- if(is_int(val_str.split('e')[0]) and is_int(val_str.split('e')[1])):
- flag = True
- else:
- flag = False
- else:
- flag = False
- return flag
-
-def is_bool(var_str):
- if( var_str.lower() =='true' or var_str.lower() == 'false'):
- return True
- else:
- return False
-
-def parse_bool(var_str):
- if(var_str.lower() =='true'):
- return True
- else:
- return False
-
-def is_list(val_str):
- if(val_str[0] == '[' and val_str[-1] == ']'):
- return True
- else:
- return False
-
-def parse_list(val_str):
- if('[' in val_str):
- splits = val_str.split('],')
- output = []
- for item in splits:
- item = item.strip()
- if(item[0] == '['):
- item = item[1:]
- if(item[-1] == ']'):
- item = item[:-1]
- print(item)
- output.append(parse_list(item))
- return output
- else:
- splits = val_str.split(',')
- output = []
- for item in splits:
- item = item.strip()
- if(is_int(item)):
- output.append(int(item))
- elif(is_float(item)):
- output.append(float(item))
- elif(is_bool(item)):
- output.append(parse_bool(item))
- elif(item.lower() == 'none'):
- output.append(None)
- else:
- output.append(item)
- return output
-
-def parse_value_from_string(val_str):
-# val_str = val_str.encode('ascii','ignore')
- if(is_int(val_str)):
- val = int(val_str)
- elif(is_float(val_str)):
- val = float(val_str)
- elif(is_list(val_str)):
- val = parse_list(val_str[1:-1])
- elif(is_bool(val_str)):
- val = parse_bool(val_str)
- elif(val_str.lower() == 'none'):
- val = None
- else:
- val = val_str
- return val
-
-def parse_config(args):
- config = configparser.ConfigParser()
- config.read(args.cfg)
- output = {}
- for section in config.sections():
- output[section] = {}
- for key in config[section]:
- val_str = str(config[section][key])
- if hasattr(args, key):
- args_key = getattr(args, key)
- if(args_key is not None):
- val_str = args_key
- print(section, key, val_str)
- if(len(val_str)>0):
- val = parse_value_from_string(val_str)
- output[section][key] = val
- else:
- val = None
-
- for key in ["train_dir", "train_csv", "valid_csv", "test_dir", "test_csv"]:
- if key in args and getattr(args, key) is not None:
- output["dataset"][key] = parse_value_from_string(getattr(args, key))
- for key in ["ckpt_dir", "iter_max", "gpus"]:
- if key in args and getattr(args, key) is not None:
- output["training"][key] = parse_value_from_string(getattr(args, key))
- for key in ["output_dir", "ckpt_mode", "ckpt_name"]:
- if key in args and getattr(args, key) is not None:
- output["testing"][key] = parse_value_from_string(getattr(args, key))
- return output
-
-def synchronize_config(config):
- data_cfg = config['dataset']
- data_cfg["task_type"] = TaskDict[data_cfg["task_type"]]
- if('network' in config):
- net_cfg = config['network']
- # data_cfg["modal_num"] = net_cfg["in_chns"]
- data_cfg["LabelToProbability_class_num".lower()] = net_cfg["class_num"]
- transform = []
- if('transform' in data_cfg and data_cfg['transform'] is not None):
- transform.extend(data_cfg['transform'])
- if('train_transform' in data_cfg and data_cfg['train_transform'] is not None):
- transform.extend(data_cfg['train_transform'])
- if('valid_transform' in data_cfg and data_cfg['valid_transform'] is not None):
- transform.extend(data_cfg['valid_transform'])
- if('test_transform' in data_cfg and data_cfg['test_transform'] is not None):
- transform.extend(data_cfg['test_transform'])
- if ( "PartialLabelToProbability" in transform and 'network' in config):
- data_cfg["PartialLabelToProbability_class_num".lower()] = net_cfg["class_num"]
- patch_size = data_cfg.get('patch_size', None)
- if(patch_size is not None):
- if('Pad' in transform and 'Pad_output_size'.lower() not in data_cfg):
- data_cfg['Pad_output_size'.lower()] = patch_size
- if('CenterCrop' in transform and 'CenterCrop_output_size'.lower() not in data_cfg):
- data_cfg['CenterCrop_output_size'.lower()] = patch_size
- if('RandomCrop' in transform and 'RandomCrop_output_size'.lower() not in data_cfg):
- data_cfg['RandomCrop_output_size'.lower()] = patch_size
- if('RandomResizedCrop' in transform and \
- 'RandomResizedCrop_output_size'.lower() not in data_cfg):
- data_cfg['RandomResizedCrop_output_size'.lower()] = patch_size
- if('testing' in config):
- test_cfg = config['testing']
- sliding_window_enable = test_cfg.get("sliding_window_enable", False)
- if(sliding_window_enable):
- sliding_window_size = test_cfg.get("sliding_window_size", None)
- if(sliding_window_size is None):
- test_cfg["sliding_window_size"] = patch_size
- sliding_window_stride = test_cfg.get("sliding_window_stride", None)
- if(sliding_window_stride is None):
- test_cfg["sliding_window_stride"] = [item // 2 for item in patch_size]
- config['testing'] = test_cfg
- config['dataset'] = data_cfg
- # config['network'] = net_cfg
- return config
-
-def wrtie_config(config, output_name):
- logging.info("The running configuations are: ")
- with open(output_name, 'w') as f:
- for section in config:
- if(isinstance(config[section], dict)):
- line = '[' + section + ']'
- f.write('\n' + line + '\n')
- logging.info(line)
- for key in config[section]:
- value = config[section][key]
- line = "{0:} = {1:}".format(key, value)
- f.write(line + '\n')
- logging.info(line)
- else:
- line = "{0:} = {1:}".format(section, config[section])
- f.write(line + "\n")
- logging.info(line)
-
-def logging_config(config):
- for section in config:
- if(isinstance(config[section], dict)):
- for key in config[section]:
- value = config[section][key]
- logging.info("{0:} {1:} = {2:}".format(section, key, value))
- else:
- logging.info("{0:} = {1:}".format(section, config[section]))
-
-if __name__ == "__main__":
- print(is_int('555'))
- print(is_float('555.10'))
- a='[1 ,2 ,3 ]'
- print(a)
- print(parse_list(a))
-
-
diff --git a/pymic/util/post_process.py b/pymic/util/post_process.py
deleted file mode 100644
index a889b23..0000000
--- a/pymic/util/post_process.py
+++ /dev/null
@@ -1,50 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import absolute_import, print_function
-
-import os
-import numpy as np
-import SimpleITK as sitk
-from pymic.util.image_process import get_largest_k_components
-
-class PostProcess(object):
- """
- The abastract class for post processing.
- """
- def __init__(self, params):
- self.params = params
-
- def __call__(self, seg):
- return seg
-
-class PostKeepLargestComponent(PostProcess):
- """
- Post process by keeping the largest component.
-
- The arguments should be written in the `params` dictionary, and it has the
- following fields:
-
- :param `KeepLargestComponent_mode`: (int)
- `1` means keep the largest component of the union of foreground classes.
- `2` means keep the largest component for each foreground class.
- """
- def __init__(self, params):
- super(PostKeepLargestComponent, self).__init__(params)
- self.mode = params.get("KeepLargestComponent_mode".lower(), 1)
-
- def __call__(self, seg):
- if(self.mode == 1):
- mask = np.asarray(seg > 0, np.uint8)
- mask = get_largest_k_components(mask)
- seg = seg * mask
- elif(self.mode == 2):
- class_num = seg.max()
- output = np.zeros_like(seg)
- for c in range(1, class_num + 1):
- seg_c = np.asarray(seg == c, np.uint8)
- seg_c = get_largest_k_components(seg_c)
- output = output + seg_c * c
- seg = output
- return seg
-
-PostProcessDict = {
- 'KeepLargestComponent': PostKeepLargestComponent}
\ No newline at end of file
diff --git a/pymic/util/ramps.py b/pymic/util/ramps.py
deleted file mode 100644
index 2f8cc9f..0000000
--- a/pymic/util/ramps.py
+++ /dev/null
@@ -1,58 +0,0 @@
-
-# -*- coding: utf-8 -*-
-"""
-Functions for ramping hyperparameters up or down.
-
-Each function takes the current training step or epoch, and the
-ramp length (start and end step or epoch), and returns a multiplier between
-0 and 1.
-"""
-from __future__ import print_function, division
-import numpy as np
-
-def get_rampup_ratio(i, start, end, mode = "linear"):
- """
- Obtain the rampup ratio.
-
- :param i: (int) The current iteration.
- :param start: (int) The start iteration.
- :param end: (int) The end itertation.
- :param mode: (str) Valid values are {`linear`, `sigmoid`, `cosine`}.
- """
- i = np.clip(i, start, end)
- if(mode == "linear"):
- rampup = (i - start) / (end - start)
- elif(mode == "sigmoid"):
- phase = 1.0 - (i - start) / (end - start)
- rampup = float(np.exp(-5.0 * phase * phase))
- elif(mode == "cosine"):
- phase = 1.0 - (i - start) / (end - start)
- rampup = float(.5 * (np.cos(np.pi * phase) + 1))
- else:
- raise ValueError("Undefined rampup mode {0:}".format(mode))
- return rampup
-
-
-def get_rampdown_ratio(i, start, end, mode = "linear"):
- """
- Obtain the rampdown ratio.
-
- :param i: (int) The current iteration.
- :param start: (int) The start iteration.
- :param end: (int) The end itertation.
- :param mode: (str) Valid values are {`linear`, `sigmoid`, `cosine`}.
- """
- i = np.clip(i, start, end)
- if(mode == "linear"):
- rampdown = 1.0 - (i - start) / (end - start)
- elif(mode == "sigmoid"):
- phase = (i - start) / (end - start)
- rampdown = float(np.exp(-5.0 * phase * phase))
- elif(mode == "cosine"):
- phase = (i - start) / (end - start)
- rampdown = float(.5 * (np.cos(np.pi * phase) + 1))
- else:
- raise ValueError("Undefined rampup mode {0:}".format(mode))
- return rampdown
-
-
\ No newline at end of file
diff --git a/requirements.txt b/requirements.txt
deleted file mode 100644
index e70fc83..0000000
--- a/requirements.txt
+++ /dev/null
@@ -1,14 +0,0 @@
-h5py
-matplotlib>=3.1.2
-numpy>=1.23.5
-pandas>=1.5.2
-scikit-image>=0.19.3
-scikit-learn>=1.2.0
-scipy>=1.10.0
-SimpleITK>=2.0.2
-tensorboard
-tensorboardX
-torch>=1.13.1
-torchvision>=0.14.1
-causal-conv1d>=1.5.0
-mamba-ssm>=2.2.4
diff --git a/setup.py b/setup.py
deleted file mode 100644
index 879ee6c..0000000
--- a/setup.py
+++ /dev/null
@@ -1,51 +0,0 @@
-# -*- coding: utf-8 -*-
-import setuptools
-
-# Get the summary
-description = 'An open-source deep learning platform' + \
- ' for annotation-efficient medical image computing'
-
-# Get the long description
-with open('README.md', encoding='utf-8') as f:
- long_description = f.read()
-
-setuptools.setup(
- name = 'PYMIC',
- version = "0.5.4",
- author ='PyMIC Consortium',
- author_email = 'wguotai@gmail.com',
- description = description,
- long_description = long_description,
- long_description_content_type = 'text/markdown',
- url = 'https://github.com/HiLab-git/PyMIC',
- license = 'Apache 2.0',
- packages = setuptools.find_packages(),
- install_requires=[
- "h5py",
- "matplotlib>=3.1.2",
- "numpy>=1.17.4",
- "pandas>=0.25.3",
- "scikit-image>=0.16.2",
- "scikit-learn>=0.22",
- "scipy>=1.3.3",
- "SimpleITK>=2.0.0",
- "tensorboard",
- "tensorboardX",
- ],
- classifiers=[
- 'License :: OSI Approved :: Apache Software License',
- 'Programming Language :: Python',
- 'Programming Language :: Python :: 2',
- 'Programming Language :: Python :: 3',
- ],
- python_requires = '>=3.6',
- entry_points = {
- 'console_scripts': [
- 'pymic_preprocess = pymic.net_run.preprocess:main',
- 'pymic_train = pymic.net_run.train:main',
- 'pymic_test = pymic.net_run.predict:main',
- 'pymic_eval_cls = pymic.util.evaluation_cls:main',
- 'pymic_eval_seg = pymic.util.evaluation_seg:main'
- ],
- },
-)